Ver código fonte

[cosmwasm] instantiate contracts on multiple chains (#799)

* instantiate contracts on multiple chains

* deploy to neurtron

* function not being used anymore

* rename file dir

* better logs

* wormhole guardian upgrade

* set default wormhole contract

* add all to stages to one file

* add extended chain config

* bug fix

* juno deployment

* removed unused parameter

* resolve bug add comments

* typo

* rename to vaa mainnet

* comment

* remove T

* hardcode checksum

* update download method comment

* update package-lock

* update package-json
Dev Kalra 2 anos atrás
pai
commit
3b03f9eddc
24 arquivos alterados com 1205 adições e 70 exclusões
  1. 1 0
      governance/xc_governance_sdk_js/src/chains.ts
  2. 527 0
      package-lock.json
  3. 4 0
      target_chains/cosmwasm/tools/package.json
  4. 12 4
      target_chains/cosmwasm/tools/src/chains-manager/chains.ts
  5. 20 15
      target_chains/cosmwasm/tools/src/chains-manager/cosmwasm.ts
  6. 1 1
      target_chains/cosmwasm/tools/src/chains-manager/injective.ts
  7. 9 0
      target_chains/cosmwasm/tools/src/contract-checksum.ts
  8. 54 0
      target_chains/cosmwasm/tools/src/extended-chain-config.ts
  9. 115 0
      target_chains/cosmwasm/tools/src/helper.ts
  10. 187 0
      target_chains/cosmwasm/tools/src/instantiate-pyth.ts
  11. 4 17
      target_chains/cosmwasm/tools/src/pipeline.ts
  12. 9 33
      target_chains/cosmwasm/tools/src/wormhole-stub.ts
  13. 22 0
      target_chains/cosmwasm/tools/testnet/instantiate-pyth/injective-1.2.0.json
  14. 22 0
      target_chains/cosmwasm/tools/testnet/instantiate-pyth/juno-1.2.0.json
  15. 22 0
      target_chains/cosmwasm/tools/testnet/instantiate-pyth/neutron_pion_1-1.2.0.json
  16. 22 0
      target_chains/cosmwasm/tools/testnet/instantiate-pyth/osmosis_4-1.2.0.json
  17. 22 0
      target_chains/cosmwasm/tools/testnet/instantiate-pyth/osmosis_5-1.2.0.json
  18. 22 0
      target_chains/cosmwasm/tools/testnet/instantiate-pyth/sei_atlantic_2-1.2.0.json
  19. 18 0
      target_chains/cosmwasm/wormhole-stub/testnet/injective-2.14.9.json
  20. 40 0
      target_chains/cosmwasm/wormhole-stub/testnet/juno-2.14.9.json
  21. 18 0
      target_chains/cosmwasm/wormhole-stub/testnet/neutron_pion_1-2.14.9.json
  22. 18 0
      target_chains/cosmwasm/wormhole-stub/testnet/osmosis_4-2.14.9.json
  23. 18 0
      target_chains/cosmwasm/wormhole-stub/testnet/osmosis_5-2.14.9.json
  24. 18 0
      target_chains/cosmwasm/wormhole-stub/testnet/sei_atlantic_2-2.14.9.json

+ 1 - 0
governance/xc_governance_sdk_js/src/chains.ts

@@ -17,6 +17,7 @@ export const RECEIVER_CHAINS = {
   sei: 60013,
   osmosis: 60014,
   neutron: 60015,
+  juno: 60016,
 };
 
 // If there is any overlapping value the receiver chain will replace the wormhole

+ 527 - 0
package-lock.json

@@ -7273,6 +7273,95 @@
         "follow-redirects": "^1.14.0"
       }
     },
+    "node_modules/@isaacs/cliui": {
+      "version": "8.0.2",
+      "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+      "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+      "dependencies": {
+        "string-width": "^5.1.2",
+        "string-width-cjs": "npm:string-width@^4.2.0",
+        "strip-ansi": "^7.0.1",
+        "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+        "wrap-ansi": "^8.1.0",
+        "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+      "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+      }
+    },
+    "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+      "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
+      "version": "9.2.2",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+      "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="
+    },
+    "node_modules/@isaacs/cliui/node_modules/string-width": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+      "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+      "dependencies": {
+        "eastasianwidth": "^0.2.0",
+        "emoji-regex": "^9.2.2",
+        "strip-ansi": "^7.0.1"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz",
+      "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==",
+      "dependencies": {
+        "ansi-regex": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+      }
+    },
+    "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+      "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+      "dependencies": {
+        "ansi-styles": "^6.1.0",
+        "string-width": "^5.0.1",
+        "strip-ansi": "^7.0.1"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+      }
+    },
     "node_modules/@isaacs/string-locale-compare": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz",
@@ -11350,6 +11439,15 @@
         "typescript": "^3 || ^4"
       }
     },
+    "node_modules/@pkgjs/parseargs": {
+      "version": "0.11.0",
+      "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+      "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+      "optional": true,
+      "engines": {
+        "node": ">=14"
+      }
+    },
     "node_modules/@project-serum/anchor": {
       "version": "0.25.0",
       "resolved": "https://registry.npmjs.org/@project-serum/anchor/-/anchor-0.25.0.tgz",
@@ -18587,6 +18685,15 @@
         "@types/node": "*"
       }
     },
+    "node_modules/@types/adm-zip": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/@types/adm-zip/-/adm-zip-0.5.0.tgz",
+      "integrity": "sha512-FCJBJq9ODsQZUNURo5ILAQueuA8WJhRvuihS3ke2iI25mJlfV2LK8jG2Qj2z2AWg8U0FtWWqBHVRetceLskSaw==",
+      "dev": true,
+      "dependencies": {
+        "@types/node": "*"
+      }
+    },
     "node_modules/@types/aria-query": {
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.1.tgz",
@@ -26149,6 +26256,11 @@
         "safe-buffer": "~5.1.0"
       }
     },
+    "node_modules/eastasianwidth": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+      "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="
+    },
     "node_modules/ecc-jsbn": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
@@ -29599,6 +29711,32 @@
       "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==",
       "dev": true
     },
+    "node_modules/foreground-child": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
+      "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",
+      "dependencies": {
+        "cross-spawn": "^7.0.0",
+        "signal-exit": "^4.0.1"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/foreground-child/node_modules/signal-exit": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz",
+      "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==",
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
     "node_modules/forever-agent": {
       "version": "0.6.1",
       "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
@@ -33364,6 +33502,23 @@
       "integrity": "sha512-Cu/kb+4HiNSejAPhSaN1VukdNTTi/r4/e+yykqjlG/IW+1gZH5b4+Bq3whDX4tvbYugta3r8KTMUiqT3fIGxuQ==",
       "dev": true
     },
+    "node_modules/jackspeak": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.0.tgz",
+      "integrity": "sha512-r5XBrqIJfwRIjRt/Xr5fv9Wh09qyhHfKnYddDlpM+ibRR20qrYActpCAgU6U+d53EOEjzkvxPMVHSlgR7leXrQ==",
+      "dependencies": {
+        "@isaacs/cliui": "^8.0.2"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      },
+      "optionalDependencies": {
+        "@pkgjs/parseargs": "^0.11.0"
+      }
+    },
     "node_modules/jake": {
       "version": "10.8.5",
       "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz",
@@ -39355,6 +39510,17 @@
         "node": ">= 0.10.5"
       }
     },
+    "node_modules/node-downloader-helper": {
+      "version": "2.1.7",
+      "resolved": "https://registry.npmjs.org/node-downloader-helper/-/node-downloader-helper-2.1.7.tgz",
+      "integrity": "sha512-3dBuMF/XPy5WFi3XiiXaglafzoycRH5GjmRz1nAt2uI9D+TcBrc+n/AzH8bzLHR85Wsf6vZSZblzw+MiUS/WNQ==",
+      "bin": {
+        "ndh": "bin/ndh"
+      },
+      "engines": {
+        "node": ">=14.18"
+      }
+    },
     "node_modules/node-fetch": {
       "version": "2.6.8",
       "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.8.tgz",
@@ -41169,6 +41335,37 @@
       "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
       "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
     },
+    "node_modules/path-scurry": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.9.1.tgz",
+      "integrity": "sha512-UgmoiySyjFxP6tscZDgWGEAgsW5ok8W3F5CJDnnH2pozwSTGE6eH7vwTotMwATWA2r5xqdkKdxYPkwlJjAI/3g==",
+      "dependencies": {
+        "lru-cache": "^9.1.1",
+        "minipass": "^5.0.0 || ^6.0.0"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/path-scurry/node_modules/lru-cache": {
+      "version": "9.1.1",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.1.tgz",
+      "integrity": "sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==",
+      "engines": {
+        "node": "14 || >=16.14"
+      }
+    },
+    "node_modules/path-scurry/node_modules/minipass": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.0.tgz",
+      "integrity": "sha512-mvD5U4pUen1aWcjTxUgdoMg6PB98dcV0obc/OiPzls79++IpgNoO+MCbOHRlKfWIOvjIjmjUygjZmSStP7B0Og==",
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      }
+    },
     "node_modules/path-to-regexp": {
       "version": "0.1.7",
       "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
@@ -49639,6 +49836,20 @@
         "node": ">=8"
       }
     },
+    "node_modules/string-width-cjs": {
+      "name": "string-width",
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+      "dependencies": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/string.prototype.matchall": {
       "version": "4.0.8",
       "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz",
@@ -49731,6 +49942,18 @@
         "node": ">=8"
       }
     },
+    "node_modules/strip-ansi-cjs": {
+      "name": "strip-ansi",
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/strip-bom": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
@@ -54607,6 +54830,23 @@
         "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
       }
     },
+    "node_modules/wrap-ansi-cjs": {
+      "name": "wrap-ansi",
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+      "dependencies": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+      }
+    },
     "node_modules/wrappy": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
@@ -56915,14 +57155,18 @@
         "@ltd/j-toml": "^1.38.0",
         "@pythnetwork/xc-governance-sdk": "*",
         "@terra-money/terra.js": "^3.1.3",
+        "adm-zip": "^0.5.10",
         "chain-registry": "^1.6.0",
         "cosmjs-utils": "^0.1.0",
         "dotenv": "^16.0.0",
         "ethers": "^5.4.4",
+        "node-downloader-helper": "^2.1.7",
         "osmojs": "^13.0.0-rc.7-i-alpha",
+        "rimraf": "^5.0.0",
         "yargs": "^17.0.1"
       },
       "devDependencies": {
+        "@types/adm-zip": "^0.5.0",
         "@types/yargs": "^17.0.18",
         "@typescript-eslint/eslint-plugin": "^5.43.0",
         "@typescript-eslint/parser": "^5.43.0",
@@ -57207,6 +57451,14 @@
         "store2": "^2.12.0"
       }
     },
+    "target_chains/cosmwasm/tools/node_modules/adm-zip": {
+      "version": "0.5.10",
+      "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.10.tgz",
+      "integrity": "sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==",
+      "engines": {
+        "node": ">=6.0"
+      }
+    },
     "target_chains/cosmwasm/tools/node_modules/axios": {
       "version": "0.21.4",
       "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
@@ -57215,6 +57467,14 @@
         "follow-redirects": "^1.14.0"
       }
     },
+    "target_chains/cosmwasm/tools/node_modules/brace-expansion": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
+    },
     "target_chains/cosmwasm/tools/node_modules/cliui": {
       "version": "8.0.1",
       "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
@@ -57246,6 +57506,49 @@
         "node": ">=12"
       }
     },
+    "target_chains/cosmwasm/tools/node_modules/glob": {
+      "version": "10.2.4",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.4.tgz",
+      "integrity": "sha512-fDboBse/sl1oXSLhIp0FcCJgzW9KmhC/q8ULTKC82zc+DL3TL7FNb8qlt5qqXN53MsKEUSIcb+7DLmEygOE5Yw==",
+      "dependencies": {
+        "foreground-child": "^3.1.0",
+        "jackspeak": "^2.0.3",
+        "minimatch": "^9.0.0",
+        "minipass": "^5.0.0 || ^6.0.0",
+        "path-scurry": "^1.7.0"
+      },
+      "bin": {
+        "glob": "dist/cjs/src/bin.js"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "target_chains/cosmwasm/tools/node_modules/minimatch": {
+      "version": "9.0.0",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz",
+      "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==",
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "target_chains/cosmwasm/tools/node_modules/minipass": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.0.tgz",
+      "integrity": "sha512-mvD5U4pUen1aWcjTxUgdoMg6PB98dcV0obc/OiPzls79++IpgNoO+MCbOHRlKfWIOvjIjmjUygjZmSStP7B0Og==",
+      "engines": {
+        "node": ">=16 || 14 >=14.17"
+      }
+    },
     "target_chains/cosmwasm/tools/node_modules/protobufjs": {
       "version": "6.11.3",
       "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz",
@@ -57271,6 +57574,23 @@
         "pbts": "bin/pbts"
       }
     },
+    "target_chains/cosmwasm/tools/node_modules/rimraf": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.0.tgz",
+      "integrity": "sha512-Jf9llaP+RvaEVS5nPShYFhtXIrb3LRKP281ib3So0KkeZKo2wIKyq0Re7TOSwanasA423PSr6CCIL4bP6T040g==",
+      "dependencies": {
+        "glob": "^10.0.0"
+      },
+      "bin": {
+        "rimraf": "dist/cjs/src/bin.js"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
     "target_chains/cosmwasm/tools/node_modules/yargs": {
       "version": "17.7.2",
       "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
@@ -62652,6 +62972,64 @@
         }
       }
     },
+    "@isaacs/cliui": {
+      "version": "8.0.2",
+      "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+      "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+      "requires": {
+        "string-width": "^5.1.2",
+        "string-width-cjs": "npm:string-width@^4.2.0",
+        "strip-ansi": "^7.0.1",
+        "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+        "wrap-ansi": "^8.1.0",
+        "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+          "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA=="
+        },
+        "ansi-styles": {
+          "version": "6.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+          "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="
+        },
+        "emoji-regex": {
+          "version": "9.2.2",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+          "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="
+        },
+        "string-width": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+          "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+          "requires": {
+            "eastasianwidth": "^0.2.0",
+            "emoji-regex": "^9.2.2",
+            "strip-ansi": "^7.0.1"
+          }
+        },
+        "strip-ansi": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz",
+          "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==",
+          "requires": {
+            "ansi-regex": "^6.0.1"
+          }
+        },
+        "wrap-ansi": {
+          "version": "8.1.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+          "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+          "requires": {
+            "ansi-styles": "^6.1.0",
+            "string-width": "^5.0.1",
+            "strip-ansi": "^7.0.1"
+          }
+        }
+      }
+    },
     "@isaacs/string-locale-compare": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz",
@@ -65930,6 +66308,12 @@
         "esquery": "^1.0.1"
       }
     },
+    "@pkgjs/parseargs": {
+      "version": "0.11.0",
+      "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+      "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+      "optional": true
+    },
     "@project-serum/anchor": {
       "version": "0.25.0",
       "resolved": "https://registry.npmjs.org/@project-serum/anchor/-/anchor-0.25.0.tgz",
@@ -66065,9 +66449,11 @@
         "@ltd/j-toml": "^1.38.0",
         "@pythnetwork/xc-governance-sdk": "*",
         "@terra-money/terra.js": "^3.1.3",
+        "@types/adm-zip": "^0.5.0",
         "@types/yargs": "^17.0.18",
         "@typescript-eslint/eslint-plugin": "^5.43.0",
         "@typescript-eslint/parser": "^5.43.0",
+        "adm-zip": "^0.5.10",
         "chain-registry": "^1.6.0",
         "cosmjs-types": "^0.6.1",
         "cosmjs-utils": "^0.1.0",
@@ -66075,7 +66461,9 @@
         "eslint": "^8.27.0",
         "eslint-config-prettier": "^8.5.0",
         "ethers": "^5.4.4",
+        "node-downloader-helper": "^2.1.7",
         "osmojs": "^13.0.0-rc.7-i-alpha",
+        "rimraf": "^5.0.0",
         "ts-node": "^10.9.1",
         "typescript": "^4.9.3",
         "yargs": "^17.0.1"
@@ -66361,6 +66749,11 @@
             "store2": "^2.12.0"
           }
         },
+        "adm-zip": {
+          "version": "0.5.10",
+          "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.10.tgz",
+          "integrity": "sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ=="
+        },
         "axios": {
           "version": "0.21.4",
           "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
@@ -66369,6 +66762,14 @@
             "follow-redirects": "^1.14.0"
           }
         },
+        "brace-expansion": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+          "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+          "requires": {
+            "balanced-match": "^1.0.0"
+          }
+        },
         "cliui": {
           "version": "8.0.1",
           "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
@@ -66394,6 +66795,31 @@
           "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz",
           "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ=="
         },
+        "glob": {
+          "version": "10.2.4",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.4.tgz",
+          "integrity": "sha512-fDboBse/sl1oXSLhIp0FcCJgzW9KmhC/q8ULTKC82zc+DL3TL7FNb8qlt5qqXN53MsKEUSIcb+7DLmEygOE5Yw==",
+          "requires": {
+            "foreground-child": "^3.1.0",
+            "jackspeak": "^2.0.3",
+            "minimatch": "^9.0.0",
+            "minipass": "^5.0.0 || ^6.0.0",
+            "path-scurry": "^1.7.0"
+          }
+        },
+        "minimatch": {
+          "version": "9.0.0",
+          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz",
+          "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==",
+          "requires": {
+            "brace-expansion": "^2.0.1"
+          }
+        },
+        "minipass": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.0.tgz",
+          "integrity": "sha512-mvD5U4pUen1aWcjTxUgdoMg6PB98dcV0obc/OiPzls79++IpgNoO+MCbOHRlKfWIOvjIjmjUygjZmSStP7B0Og=="
+        },
         "protobufjs": {
           "version": "6.11.3",
           "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz",
@@ -66414,6 +66840,14 @@
             "long": "^4.0.0"
           }
         },
+        "rimraf": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.0.tgz",
+          "integrity": "sha512-Jf9llaP+RvaEVS5nPShYFhtXIrb3LRKP281ib3So0KkeZKo2wIKyq0Re7TOSwanasA423PSr6CCIL4bP6T040g==",
+          "requires": {
+            "glob": "^10.0.0"
+          }
+        },
         "yargs": {
           "version": "17.7.2",
           "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
@@ -75320,6 +75754,15 @@
         "@types/node": "*"
       }
     },
+    "@types/adm-zip": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/@types/adm-zip/-/adm-zip-0.5.0.tgz",
+      "integrity": "sha512-FCJBJq9ODsQZUNURo5ILAQueuA8WJhRvuihS3ke2iI25mJlfV2LK8jG2Qj2z2AWg8U0FtWWqBHVRetceLskSaw==",
+      "dev": true,
+      "requires": {
+        "@types/node": "*"
+      }
+    },
     "@types/aria-query": {
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.1.tgz",
@@ -81551,6 +81994,11 @@
         }
       }
     },
+    "eastasianwidth": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+      "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="
+    },
     "ecc-jsbn": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
@@ -84357,6 +84805,22 @@
       "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==",
       "dev": true
     },
+    "foreground-child": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
+      "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",
+      "requires": {
+        "cross-spawn": "^7.0.0",
+        "signal-exit": "^4.0.1"
+      },
+      "dependencies": {
+        "signal-exit": {
+          "version": "4.0.2",
+          "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz",
+          "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q=="
+        }
+      }
+    },
     "forever-agent": {
       "version": "0.6.1",
       "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
@@ -87117,6 +87581,15 @@
       "integrity": "sha512-Cu/kb+4HiNSejAPhSaN1VukdNTTi/r4/e+yykqjlG/IW+1gZH5b4+Bq3whDX4tvbYugta3r8KTMUiqT3fIGxuQ==",
       "dev": true
     },
+    "jackspeak": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.0.tgz",
+      "integrity": "sha512-r5XBrqIJfwRIjRt/Xr5fv9Wh09qyhHfKnYddDlpM+ibRR20qrYActpCAgU6U+d53EOEjzkvxPMVHSlgR7leXrQ==",
+      "requires": {
+        "@isaacs/cliui": "^8.0.2",
+        "@pkgjs/parseargs": "^0.11.0"
+      }
+    },
     "jake": {
       "version": "10.8.5",
       "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz",
@@ -91892,6 +92365,11 @@
         "minimatch": "^3.0.2"
       }
     },
+    "node-downloader-helper": {
+      "version": "2.1.7",
+      "resolved": "https://registry.npmjs.org/node-downloader-helper/-/node-downloader-helper-2.1.7.tgz",
+      "integrity": "sha512-3dBuMF/XPy5WFi3XiiXaglafzoycRH5GjmRz1nAt2uI9D+TcBrc+n/AzH8bzLHR85Wsf6vZSZblzw+MiUS/WNQ=="
+    },
     "node-fetch": {
       "version": "2.6.8",
       "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.8.tgz",
@@ -93302,6 +93780,27 @@
       "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
       "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
     },
+    "path-scurry": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.9.1.tgz",
+      "integrity": "sha512-UgmoiySyjFxP6tscZDgWGEAgsW5ok8W3F5CJDnnH2pozwSTGE6eH7vwTotMwATWA2r5xqdkKdxYPkwlJjAI/3g==",
+      "requires": {
+        "lru-cache": "^9.1.1",
+        "minipass": "^5.0.0 || ^6.0.0"
+      },
+      "dependencies": {
+        "lru-cache": {
+          "version": "9.1.1",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.1.tgz",
+          "integrity": "sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A=="
+        },
+        "minipass": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.0.tgz",
+          "integrity": "sha512-mvD5U4pUen1aWcjTxUgdoMg6PB98dcV0obc/OiPzls79++IpgNoO+MCbOHRlKfWIOvjIjmjUygjZmSStP7B0Og=="
+        }
+      }
+    },
     "path-to-regexp": {
       "version": "0.1.7",
       "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
@@ -100649,6 +101148,16 @@
         "strip-ansi": "^6.0.1"
       }
     },
+    "string-width-cjs": {
+      "version": "npm:string-width@4.2.3",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+      "requires": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
+      }
+    },
     "string.prototype.matchall": {
       "version": "4.0.8",
       "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz",
@@ -100719,6 +101228,14 @@
         "ansi-regex": "^5.0.1"
       }
     },
+    "strip-ansi-cjs": {
+      "version": "npm:strip-ansi@6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "requires": {
+        "ansi-regex": "^5.0.1"
+      }
+    },
     "strip-bom": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
@@ -104583,6 +105100,16 @@
         "strip-ansi": "^6.0.0"
       }
     },
+    "wrap-ansi-cjs": {
+      "version": "npm:wrap-ansi@7.0.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+      "requires": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      }
+    },
     "wrappy": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",

+ 4 - 0
target_chains/cosmwasm/tools/package.json

@@ -20,14 +20,18 @@
     "@ltd/j-toml": "^1.38.0",
     "@pythnetwork/xc-governance-sdk": "*",
     "@terra-money/terra.js": "^3.1.3",
+    "adm-zip": "^0.5.10",
     "chain-registry": "^1.6.0",
     "cosmjs-utils": "^0.1.0",
     "dotenv": "^16.0.0",
     "ethers": "^5.4.4",
+    "node-downloader-helper": "^2.1.7",
     "osmojs": "^13.0.0-rc.7-i-alpha",
+    "rimraf": "^5.0.0",
     "yargs": "^17.0.1"
   },
   "devDependencies": {
+    "@types/adm-zip": "^0.5.0",
     "@types/yargs": "^17.0.18",
     "@typescript-eslint/eslint-plugin": "^5.43.0",
     "@typescript-eslint/parser": "^5.43.0",

+ 12 - 4
target_chains/cosmwasm/tools/src/chains-manager/chains.ts

@@ -18,6 +18,7 @@ export enum ChainIdTestnet {
   OSMOSIS_5 = "osmosis_5",
   SEI_ATLANTIC_2 = "sei_atlantic_2",
   NEUTRON_PION_1 = "neutron_pion_1",
+  JUNO = "juno",
 }
 
 export const ChainIdsTestnet = Object.values(ChainIdTestnet);
@@ -86,7 +87,7 @@ export const ChainsConfigTestnet: Record<ChainIdTestnet, ChainConfig> = {
     executorEndpoint: "https://rpc.atlantic-2.seinetwork.io/",
     querierEndpoint: "https://rpc.atlantic-2.seinetwork.io/",
     prefix: "sei",
-    gasPrice: "0.1usei",
+    gasPrice: "0.01usei",
   },
   [ChainIdTestnet.NEUTRON_PION_1]: {
     chainId: ChainIdTestnet.NEUTRON_PION_1,
@@ -96,16 +97,23 @@ export const ChainsConfigTestnet: Record<ChainIdTestnet, ChainConfig> = {
     prefix: "neutron",
     gasPrice: "0.025untrn",
   },
+  [ChainIdTestnet.JUNO]: {
+    chainId: ChainIdTestnet.JUNO,
+    chainType: ChainType.COSMWASM,
+    executorEndpoint: "https://rpc.uni.junonetwork.io/",
+    querierEndpoint: "https://rpc.uni.junonetwork.io/",
+    prefix: "juno",
+    gasPrice: "0.025ujunox",
+  },
 };
 
 /**
- * This method will return an executor for that corresponding chainType for given chainId.
+ * This method will return an executor for given chainConfig.
  */
 export function createExecutorForChain(
-  chainId: ChainIdTestnet,
+  chainConfig: ChainConfig,
   mnemonic: string
 ): ChainExecutor {
-  const chainConfig = ChainsConfigTestnet[chainId];
   const chainType = chainConfig.chainType;
 
   if (chainType === ChainType.INJECTIVE) {

+ 20 - 15
target_chains/cosmwasm/tools/src/chains-manager/cosmwasm.ts

@@ -63,23 +63,28 @@ export class CosmwasmExecutor implements ChainExecutor {
       }
     );
 
-    const txResponse = await cosmwasmClient.signAndBroadcast(
-      address,
-      [encodedMsgObject],
-      1.5
-    );
-
-    if (txResponse.code !== 0) {
-      throw new Error(`Transaction failed: ${txResponse.rawLog}`);
-    } else {
-      console.log(
-        `Broadcasted transaction hash: ${JSON.stringify(
-          txResponse.transactionHash
-        )}`
+    try {
+      const txResponse = await cosmwasmClient.signAndBroadcast(
+        address,
+        [encodedMsgObject],
+        1.5
       );
-    }
 
-    return txResponse;
+      if (txResponse.code !== 0) {
+        throw new Error(`Transaction failed: ${txResponse.rawLog}`);
+      } else {
+        console.log(
+          `Broadcasted transaction hash: ${JSON.stringify(
+            txResponse.transactionHash
+          )}`
+        );
+      }
+
+      return txResponse;
+    } catch (e) {
+      console.log(e);
+      throw e;
+    }
   }
 
   async storeCode(req: StoreCodeRequest): Promise<StoreCodeResponse> {

+ 1 - 1
target_chains/cosmwasm/tools/src/chains-manager/injective.ts

@@ -31,7 +31,7 @@ const DEFAULT_GAS_PRICE = 500000000;
 export class InjectiveExecutor implements ChainExecutor {
   private readonly wallet: PrivateKey;
   private readonly chainId = "injective-888";
-  private readonly gasMultiplier = 1.8;
+  private readonly gasMultiplier = 2;
   private readonly gasPrice = DEFAULT_GAS_PRICE;
 
   constructor(

+ 9 - 0
target_chains/cosmwasm/tools/src/contract-checksum.ts

@@ -0,0 +1,9 @@
+export const CHECKSUM: any = {
+  "1.2.0": {
+    osmosis: "9ac1f9a70316c09ff4e1c25e36499a02b9f46ed60486b10164f5bd4b7c0a0cac",
+    injective:
+      "4f7508a76317737eba784400ec1feb443dc5cc3ecce62acbcf4e8a9832e36f06",
+    cosmwasm:
+      "788ade6d9ccaca40cea29a6a795319548e8b3ab8925dc33eb902ed6ca615557f",
+  },
+};

+ 54 - 0
target_chains/cosmwasm/tools/src/extended-chain-config.ts

@@ -0,0 +1,54 @@
+import { CHAINS } from "@pythnetwork/xc-governance-sdk";
+import {
+  ChainConfig,
+  ChainIdTestnet,
+  ChainsConfigTestnet,
+} from "./chains-manager/chains";
+
+export type ExtendedChainConfig = ChainConfig & {
+  feeDenom: string;
+  pythArtifactZipName: string;
+  wormholeChainId: number;
+};
+
+export const ExtendedChainsConfigTestnet: Record<
+  ChainIdTestnet,
+  ExtendedChainConfig
+> = {
+  [ChainIdTestnet.INJECTIVE]: {
+    feeDenom: "inj",
+    pythArtifactZipName: "injective",
+    wormholeChainId: CHAINS.injective,
+    ...ChainsConfigTestnet[ChainIdTestnet.INJECTIVE],
+  },
+  [ChainIdTestnet.OSMOSIS_4]: {
+    feeDenom: "uosmo",
+    pythArtifactZipName: "osmosis",
+    wormholeChainId: CHAINS.osmosis,
+    ...ChainsConfigTestnet[ChainIdTestnet.OSMOSIS_4],
+  },
+  [ChainIdTestnet.OSMOSIS_5]: {
+    feeDenom: "uosmo",
+    pythArtifactZipName: "osmosis",
+    wormholeChainId: CHAINS.osmosis,
+    ...ChainsConfigTestnet[ChainIdTestnet.OSMOSIS_5],
+  },
+  [ChainIdTestnet.SEI_ATLANTIC_2]: {
+    feeDenom: "usei",
+    pythArtifactZipName: "cosmwasm",
+    wormholeChainId: CHAINS.sei,
+    ...ChainsConfigTestnet[ChainIdTestnet.SEI_ATLANTIC_2],
+  },
+  [ChainIdTestnet.NEUTRON_PION_1]: {
+    feeDenom: "untrn",
+    pythArtifactZipName: "cosmwasm",
+    wormholeChainId: CHAINS.neutron,
+    ...ChainsConfigTestnet[ChainIdTestnet.NEUTRON_PION_1],
+  },
+  [ChainIdTestnet.JUNO]: {
+    feeDenom: "ujunox",
+    pythArtifactZipName: "cosmwasm",
+    wormholeChainId: CHAINS.juno,
+    ...ChainsConfigTestnet[ChainIdTestnet.JUNO],
+  },
+};

+ 115 - 0
target_chains/cosmwasm/tools/src/helper.ts

@@ -0,0 +1,115 @@
+import { readFileSync, existsSync, mkdirSync } from "fs";
+import { rimrafSync } from "rimraf";
+import AdmZip from "adm-zip";
+import path from "path";
+import { DownloaderHelper } from "node-downloader-helper";
+
+// We have released the compile contacts on github. If a chain needs some specific
+// feature in a contract, a version of the contract with that specific features is
+// released. For example, "injective.zip" for injective.
+// NOTE that the each zip file should contain the compiled code with the same file
+// name `pyth_cosmwasm.wasm`
+// Given a contract version (eg 1.2.0) and  zipFileNames (eg ["injective", "osmosis"])
+// this method will return an object with key = zipFileName and value = compiledCode
+export async function getContractBytesDict(
+  artifactZipFileNames: string[],
+  version: string
+) {
+  const githubArtifactsLink = `https://github.com/pyth-network/pyth-crosschain/releases/download/pyth-cosmwasm-contract-v${version}/`;
+  const tmpCodeStorageDir = "./tmp";
+  // clear tmp directory before downloading contracts
+  rimrafSync(tmpCodeStorageDir);
+
+  if (existsSync(tmpCodeStorageDir) === false) {
+    mkdirSync(tmpCodeStorageDir, { recursive: true });
+  }
+
+  const uniqueArtifactsZipName = Array.from(new Set(artifactZipFileNames));
+
+  // download zip files
+  await Promise.all(
+    uniqueArtifactsZipName.map(async (artifactZipName) => {
+      return new Promise<void>((resolve, reject) => {
+        const dl = new DownloaderHelper(
+          githubArtifactsLink + artifactZipName + ".zip",
+          tmpCodeStorageDir
+        );
+
+        dl.on("end", () => {
+          console.log("Download Completed");
+          resolve();
+        });
+        dl.on("error", (err) => {
+          console.log("Download Failed", err);
+          reject(err);
+        });
+        dl.start().catch((err) => {
+          console.error(err);
+          reject(err);
+        });
+      });
+    })
+  );
+
+  // extract zip files
+  uniqueArtifactsZipName.map(async (artifactZipName) => {
+    const zip = new AdmZip(
+      path.resolve(tmpCodeStorageDir + "/" + artifactZipName + ".zip")
+    );
+    zip.extractAllTo(path.resolve(tmpCodeStorageDir));
+  });
+
+  let contractBytesDict: { [fileName: string]: Buffer } = {};
+  for (let uniqueArtifactZipName of uniqueArtifactsZipName) {
+    const contractBytes = readFileSync(
+      tmpCodeStorageDir + "/" + uniqueArtifactZipName + "/pyth_cosmwasm.wasm"
+    );
+    contractBytesDict[uniqueArtifactZipName] = contractBytes;
+  }
+
+  // clear tmp directory after downloading contracts
+  rimrafSync(tmpCodeStorageDir);
+
+  return contractBytesDict;
+}
+
+export const WORMHOLE_CONTRACT_VERSION = "2.14.9";
+
+// This method returns the file name which stores the deployment result for
+// wormhole stub
+export function getWormholeFileName(
+  chainId: string,
+  version: string,
+  mainnet: boolean
+): string {
+  const WORMHOLE_STORAGE_DIR = mainnet
+    ? "../wormhole-stub/mainnet"
+    : "../wormhole-stub/testnet";
+
+  return `${WORMHOLE_STORAGE_DIR}/${chainId}-${version}.json`;
+}
+
+// This method will read the wormhole file with the deployment resutt and will
+// return the deployed wormhole contract address
+export function getWormholeContractAddress(
+  chainId: string,
+  version: string,
+  mainnet: boolean
+): string {
+  let deployedFilePath = getWormholeFileName(chainId, version, mainnet);
+  const wormholeContractAddress = JSON.parse(
+    readFileSync(deployedFilePath).toString()
+  )["instantiate-contract"].result.contractAddr;
+
+  if (wormholeContractAddress === undefined)
+    throw new Error(
+      "Wormhole contract address should be present in the file" +
+        deployedFilePath
+    );
+
+  return wormholeContractAddress;
+}
+
+export function hexToBase64(hex: string): string {
+  return Buffer.from(hex, "hex").toString("base64");
+}

+ 187 - 0
target_chains/cosmwasm/tools/src/instantiate-pyth.ts

@@ -0,0 +1,187 @@
+import {
+  ChainIdsTestnet,
+  createExecutorForChain,
+} from "./chains-manager/chains";
+import yargs from "yargs";
+import { hideBin } from "yargs/helpers";
+import {
+  InstantiateContractResponse,
+  StoreCodeResponse,
+} from "./chains-manager/chain-executor";
+import { Pipeline } from "./pipeline";
+import {
+  WORMHOLE_CONTRACT_VERSION,
+  getContractBytesDict,
+  getWormholeContractAddress,
+} from "./helper";
+import { ExtendedChainsConfigTestnet } from "./extended-chain-config";
+import { sha256 } from "@cosmjs/crypto";
+import { CHECKSUM } from "./contract-checksum";
+
+const argv = yargs(hideBin(process.argv))
+  .usage("USAGE: npm run wormhole-stub -- <command>")
+  .option("mnemonic", {
+    type: "string",
+    demandOption: "Please provide the mnemonic",
+  })
+  .option("contract-version", {
+    type: "string",
+    demandOption: `Please input the contract-version of the pyth contract.`,
+  })
+  .option("chain-id", {
+    type: "string",
+    choices: ChainIdsTestnet,
+  })
+  .option("mainnet", {
+    type: "boolean",
+    desc: "Execute this script for mainnet networks. THIS WILL BE ADDED IN FUTURE",
+  })
+  .help()
+  .alias("help", "h")
+  .wrap(yargs.terminalWidth())
+  .parseSync();
+
+async function run() {
+  const STORAGE_DIR = "./testnet/instantiate-pyth";
+
+  // get the wasm code from github
+  let contractBytesDict = await getContractBytesDict(
+    Object.values(ExtendedChainsConfigTestnet).map(
+      ({ pythArtifactZipName }) => pythArtifactZipName
+    ),
+    argv.contractVersion
+  );
+
+  // check that the downloaded code has the same checksum as the one hardcoded in contract-checksum.ts
+  for (let key in contractBytesDict) {
+    const hardcodedChecksum = CHECKSUM[argv.contractVersion][key];
+    if (hardcodedChecksum === undefined)
+      throw new Error(
+        `Contract for ${key} doesn't have a checksum in "contract-checksum.ts"`
+      );
+
+    const downloadedCodeChecksum = Buffer.from(
+      sha256(contractBytesDict[key])
+    ).toString("hex");
+
+    if (downloadedCodeChecksum !== hardcodedChecksum)
+      throw new Error(
+        `Checksum doesn't match for ${key}. \n Downloaded file checksum ${downloadedCodeChecksum}. Hardcoded checksum ${hardcodedChecksum}`
+      );
+  }
+
+  console.log();
+
+  let chainIds = argv.chainId === undefined ? ChainIdsTestnet : [argv.chainId];
+  for (let chainId of chainIds) {
+    let pipelineStoreFilePath = `${STORAGE_DIR}/${chainId}-${argv.contractVersion}.json`;
+    const pipeline = new Pipeline(chainId, pipelineStoreFilePath);
+
+    const chainExecutor = createExecutorForChain(
+      ExtendedChainsConfigTestnet[chainId],
+      argv.mnemonic
+    );
+
+    // add stages
+    // 1 deploy artifact
+    pipeline.addStage({
+      id: "deploy-pyth-code",
+      executor: async () => {
+        return chainExecutor.storeCode({
+          contractBytes:
+            contractBytesDict[
+              ExtendedChainsConfigTestnet[chainId].pythArtifactZipName
+            ],
+        });
+      },
+    });
+
+    // 2 instantiate contract
+    pipeline.addStage({
+      id: "instantiate-contract",
+      executor: (getResultOfPastStage) => {
+        const storeCodeRes: StoreCodeResponse =
+          getResultOfPastStage("deploy-pyth-code");
+
+        return chainExecutor.instantiateContract({
+          codeId: storeCodeRes.codeId,
+          instMsg: getPythConfig({
+            feeDenom: ExtendedChainsConfigTestnet[chainId].feeDenom,
+            wormholeChainId:
+              ExtendedChainsConfigTestnet[chainId].wormholeChainId,
+            wormholeContract: getWormholeContractAddress(
+              chainId,
+              WORMHOLE_CONTRACT_VERSION,
+              false
+            ),
+          }),
+          label: "wormhole",
+        });
+      },
+    });
+
+    // 3 set its own admin
+    pipeline.addStage({
+      id: "set-own-admin",
+      executor: (getResultOfPastStage) => {
+        const instantiateContractRes: InstantiateContractResponse =
+          getResultOfPastStage("instantiate-contract");
+
+        return chainExecutor.updateContractAdmin({
+          newAdminAddr: instantiateContractRes.contractAddr,
+          contractAddr: instantiateContractRes.contractAddr,
+        });
+      },
+    });
+
+    await pipeline.run();
+  }
+}
+
+function getPythConfig({
+  feeDenom,
+  wormholeContract,
+  wormholeChainId,
+}: {
+  feeDenom: string;
+  wormholeContract: string;
+  wormholeChainId: number;
+}) {
+  return {
+    wormhole_contract: wormholeContract,
+    governance_source_index: 0,
+    governance_sequence_number: 0,
+    chain_id: wormholeChainId,
+    valid_time_period_secs: 60,
+    fee: {
+      amount: "1",
+      denom: feeDenom,
+    },
+    // All contracts on any network are using mainnet data sources.
+    data_sources: [
+      {
+        emitter: Buffer.from(
+          "6bb14509a612f01fbbc4cffeebd4bbfb492a86df717ebe92eb6df432a3f00a25",
+          "hex"
+        ).toString("base64"),
+        chain_id: 1,
+      },
+      {
+        emitter: Buffer.from(
+          "f8cd23c2ab91237730770bbea08d61005cdda0984348f3f6eecb559638c0bba0",
+          "hex"
+        ).toString("base64"),
+        chain_id: 26,
+      },
+    ],
+    governance_source: {
+      emitter: Buffer.from(
+        "5635979a221c34931e32620b9293a463065555ea71fe97cd6237ade875b12e9e",
+        "hex"
+      ).toString("base64"),
+      chain_id: 1,
+    },
+  };
+}
+
+run();

+ 4 - 17
target_chains/cosmwasm/tools/src/pipeline.ts

@@ -1,22 +1,6 @@
 import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
-import { createInterface } from "readline";
 import path from "path";
 
-// This function lets you write a question to the terminal
-// And returns the response of the user
-function readLineAsync(msg: string) {
-  const readline = createInterface({
-    input: process.stdin,
-    output: process.stdout,
-  });
-
-  return new Promise((resolve) => {
-    readline.question(msg, (userRes) => {
-      resolve(userRes);
-    });
-  });
-}
-
 // The stage executor is where the stage functionality is defined
 // Optionally it can take in a method `getResultOfPastStage` as a parameter
 // if it wants to access the result of the previous stages
@@ -129,6 +113,8 @@ export class Pipeline {
       // This method is only going to process stage if all the past ones have been fulfilled
       let fulfilled = await this.processStage(stage);
 
+      console.log(`${this.id}: Processed stage with id: ${stage.id}`);
+
       // store the whole processing locally after every stage
       this.pipelineStore.commit();
       if (fulfilled === false) break;
@@ -170,6 +156,7 @@ class PipelineStore {
   // for permanent storage
   commit() {
     mkdirSync(path.dirname(this.filePath), { recursive: true });
-    writeFileSync(this.filePath, JSON.stringify(this.store, null, 4));
+    // The "\n" at the end of the line is to satisfy the formatting rules
+    writeFileSync(this.filePath, JSON.stringify(this.store, null, 2) + "\n");
   }
 }

Diferenças do arquivo suprimidas por serem muito extensas
+ 9 - 33
target_chains/cosmwasm/tools/src/wormhole-stub.ts


+ 22 - 0
target_chains/cosmwasm/tools/testnet/instantiate-pyth/injective-1.2.0.json

@@ -0,0 +1,22 @@
+{
+  "deploy-pyth-code": {
+    "status": "fulfilled",
+    "result": {
+      "txHash": "193319C684AB2D1CA0681F051D987A2112027A87A8F9BB75C938AF51B65E6F9B",
+      "codeId": 1138
+    }
+  },
+  "instantiate-contract": {
+    "status": "fulfilled",
+    "result": {
+      "txHash": "5B8D14C4AA0D75C42681F6F1E68F4DD4DF49EB5B3D5DD97DF421B5C89F878A16",
+      "contractAddr": "inj1yzx0wdn6t7xrjdpgztnrraq57nw2zxhstr97xw"
+    }
+  },
+  "set-own-admin": {
+    "status": "fulfilled",
+    "result": {
+      "txHash": "FDEC7C27C8B2AB1148C7AFEFD8AEB8D64F5119CFA70898803A0F88C56AE1A64F"
+    }
+  }
+}

+ 22 - 0
target_chains/cosmwasm/tools/testnet/instantiate-pyth/juno-1.2.0.json

@@ -0,0 +1,22 @@
+{
+  "deploy-pyth-code": {
+    "status": "fulfilled",
+    "result": {
+      "codeId": 1807,
+      "txHash": "92123EFAEC260CAF9141AEE163CA4185C410EE82E4387AED2D95BA0C9F2068D1"
+    }
+  },
+  "instantiate-contract": {
+    "status": "fulfilled",
+    "result": {
+      "contractAddr": "juno1ygyhu0zn69zm0354nzpd7zrp5xs9vpkqcuk7kfneyghrpa87msmqeskxqa",
+      "txHash": "09CC1174E8816F8628E2F17887CB718766E3B1032A4173A85682BF278A1DB53D"
+    }
+  },
+  "set-own-admin": {
+    "status": "fulfilled",
+    "result": {
+      "txHash": "042B4697E5CAFCB73C8EC5514C9A8E52CC3BD96BC645DD47F07030C5B075A545"
+    }
+  }
+}

+ 22 - 0
target_chains/cosmwasm/tools/testnet/instantiate-pyth/neutron_pion_1-1.2.0.json

@@ -0,0 +1,22 @@
+{
+  "deploy-pyth-code": {
+    "status": "fulfilled",
+    "result": {
+      "codeId": 245,
+      "txHash": "23783BB7AE1D66EA132B25C505B9E15F4E899D58EA8A57545C62BBB50DC40F9D"
+    }
+  },
+  "instantiate-contract": {
+    "status": "fulfilled",
+    "result": {
+      "contractAddr": "neutron1zpn7yhxqx2f0c6cpmp3fr42yafupz9elglvgdss2300c847ph0hsgurhlj",
+      "txHash": "24372E431DA7DD46DCFCABA1E18E6C8427A03EE2D6BE9DB4E700906FEEF333FC"
+    }
+  },
+  "set-own-admin": {
+    "status": "fulfilled",
+    "result": {
+      "txHash": "A604787CA8E32079B1A05CE5BDED1183E46102860E1A5A924A1A15B9932947BC"
+    }
+  }
+}

+ 22 - 0
target_chains/cosmwasm/tools/testnet/instantiate-pyth/osmosis_4-1.2.0.json

@@ -0,0 +1,22 @@
+{
+  "deploy-pyth-code": {
+    "status": "fulfilled",
+    "result": {
+      "codeId": 6957,
+      "txHash": "BEA793ECF41BE43AFD43254D4241C6D2C9124271371A52D1856116EE68B953E3"
+    }
+  },
+  "instantiate-contract": {
+    "status": "fulfilled",
+    "result": {
+      "contractAddr": "osmo1xws8v2yv50v0spn90yr9fe9zx8zxfppl3syn38zw59npvp8dd70sutnvsm",
+      "txHash": "C2BE424676D9680CFA8AE1C3DFD09E489D4D65A2A37EA0C5D311BFB21DF39A4A"
+    }
+  },
+  "set-own-admin": {
+    "status": "fulfilled",
+    "result": {
+      "txHash": "8500646587F80EEE7E066263236DB4C01D4F41EF7BD6F0029542B18771CA03FD"
+    }
+  }
+}

+ 22 - 0
target_chains/cosmwasm/tools/testnet/instantiate-pyth/osmosis_5-1.2.0.json

@@ -0,0 +1,22 @@
+{
+  "deploy-pyth-code": {
+    "status": "fulfilled",
+    "result": {
+      "codeId": 60,
+      "txHash": "4F4C940801C122C4F25DBF4E5BFC513859C8EBAE596E2225E9274C724A1C29BE"
+    }
+  },
+  "instantiate-contract": {
+    "status": "fulfilled",
+    "result": {
+      "contractAddr": "osmo12u2vqdecdte84kg6c3d40nwzjsya59hsj048n687m9q3t6wdmqgsq6zrlx",
+      "txHash": "8793156BE964DCF2631F2EE4E6C3D9FF9E037ACD89ABB3DA3B3242766CA689E7"
+    }
+  },
+  "set-own-admin": {
+    "status": "fulfilled",
+    "result": {
+      "txHash": "4E329EE9AE8F63DFC5C876573D5EA66063C875B4591B13555855937FE57B31B6"
+    }
+  }
+}

+ 22 - 0
target_chains/cosmwasm/tools/testnet/instantiate-pyth/sei_atlantic_2-1.2.0.json

@@ -0,0 +1,22 @@
+{
+  "deploy-pyth-code": {
+    "status": "fulfilled",
+    "result": {
+      "codeId": 370,
+      "txHash": "C6290D3455B244DD9B8503E5F219EECA29DB7B750B3FFC36CE07C7002743F522"
+    }
+  },
+  "instantiate-contract": {
+    "status": "fulfilled",
+    "result": {
+      "contractAddr": "sei1977nnu5jqatteqgve8tx7nzu9y7eh6cvq0e4g6xjx8tf5wm4nkmsfljunh",
+      "txHash": "D0ACC86A5098E70F6DCA8408EE41C3E774836F2C2796DADBEE5DAC70D74582DD"
+    }
+  },
+  "set-own-admin": {
+    "status": "fulfilled",
+    "result": {
+      "txHash": "5C5ACED6A47A32BB1990656FBC4960BCB12847CEC32C0BC61F44D2DB07B3E07B"
+    }
+  }
+}

+ 18 - 0
target_chains/cosmwasm/wormhole-stub/testnet/injective-2.14.9.json

@@ -18,5 +18,23 @@
     "result": {
       "txHash": "5B31A48AEF4250FAA09117EF63E49E81B6EFBFAC1B1C6AEFF80265434A70DD7D"
     }
+  },
+  "GUARDIAN_SET_UPGRADE_1_VAA": {
+    "status": "fulfilled",
+    "result": {
+      "txHash": "C68250F924EF5E97DA190EBEEFA550CDACC8E6F51B280AC47E7569025DE35534"
+    }
+  },
+  "GUARDIAN_SET_UPGRADE_2_VAA": {
+    "status": "fulfilled",
+    "result": {
+      "txHash": "C320BDBD719DFD5B1074AB901C4A64B209C5F882B90D8AD785D28E6C5EE4C05F"
+    }
+  },
+  "GUARDIAN_SET_UPGRADE_3_VAA": {
+    "status": "fulfilled",
+    "result": {
+      "txHash": "C20DD672BABB67868FC53E2EAF1113AFBBE718365211259D2338F746C37513F5"
+    }
   }
 }

+ 40 - 0
target_chains/cosmwasm/wormhole-stub/testnet/juno-2.14.9.json

@@ -0,0 +1,40 @@
+{
+  "deploy-wormhole-code": {
+    "status": "fulfilled",
+    "result": {
+      "codeId": 1806,
+      "txHash": "F7B066A9B667F4E66F9FEF5D2EDF6E997645AE99018F261AA9B03C0B86E5EEEA"
+    }
+  },
+  "instantiate-contract": {
+    "status": "fulfilled",
+    "result": {
+      "contractAddr": "juno1ar2pvs0p2a67fcg0x26paq0zckqs9fjxmfcwuy8hvvam68g24kdsh6pt52",
+      "txHash": "C922ABBADD9E2042DDE4DE88F9F30B41AFE53D41DD29FA8714F492735422BEB9"
+    }
+  },
+  "set-own-admin": {
+    "status": "fulfilled",
+    "result": {
+      "txHash": "F7720D2F24481BD718881B5C7394948ECEDB0A59DAD884E15164A51AF1F7BD9F"
+    }
+  },
+  "GUARDIAN_SET_UPGRADE_1_VAA": {
+    "status": "fulfilled",
+    "result": {
+      "txHash": "1EE0886A74FF1A76D1552209085FC345294CDE7300BBFD4D32423FA1D275E971"
+    }
+  },
+  "GUARDIAN_SET_UPGRADE_2_VAA": {
+    "status": "fulfilled",
+    "result": {
+      "txHash": "6809F305AC6ED188BD00C390CA6737D0A5F36BA39D8ED8504F181810671A1E20"
+    }
+  },
+  "GUARDIAN_SET_UPGRADE_3_VAA": {
+    "status": "fulfilled",
+    "result": {
+      "txHash": "8B09ED936129EDBC7FC19B00A292BCF9B9FF0819028E039C68B861F60DC94A6C"
+    }
+  }
+}

+ 18 - 0
target_chains/cosmwasm/wormhole-stub/testnet/neutron_pion_1-2.14.9.json

@@ -18,5 +18,23 @@
     "result": {
       "txHash": "B9188160725B5282D11DB83F1AC28F88879A4C03AF7B6F178EA44BD07BB76805"
     }
+  },
+  "GUARDIAN_SET_UPGRADE_1_VAA": {
+    "status": "fulfilled",
+    "result": {
+      "txHash": "6ACF2A42CEE311F5D2C980AE8CD90D0DC92330EDA940E49BEDBB7C9A8FE2802F"
+    }
+  },
+  "GUARDIAN_SET_UPGRADE_2_VAA": {
+    "status": "fulfilled",
+    "result": {
+      "txHash": "621914F52BC5BED6BF5F4D6966B8FDF7BDA4E552D1A69AA4BE78FA0C7C5500AC"
+    }
+  },
+  "GUARDIAN_SET_UPGRADE_3_VAA": {
+    "status": "fulfilled",
+    "result": {
+      "txHash": "4ED3C3AF3223030E2BBB9068767C1E8C60B7D7E5895BDE586F0E07CAA649A05C"
+    }
   }
 }

+ 18 - 0
target_chains/cosmwasm/wormhole-stub/testnet/osmosis_4-2.14.9.json

@@ -18,5 +18,23 @@
     "result": {
       "txHash": "CACD7F3608E915AC629B399C63EE2C595583AE76418949847B43795208F656EE"
     }
+  },
+  "GUARDIAN_SET_UPGRADE_1_VAA": {
+    "status": "fulfilled",
+    "result": {
+      "txHash": "068EF47F42D6A1D44EFD4100B91CCE5A5050F505A088567271F5B6689A224EE5"
+    }
+  },
+  "GUARDIAN_SET_UPGRADE_2_VAA": {
+    "status": "fulfilled",
+    "result": {
+      "txHash": "AA7D06318A6945F1519A8C7DAD75141BCBC21C1F7E800B48C8045AAF1BF8A887"
+    }
+  },
+  "GUARDIAN_SET_UPGRADE_3_VAA": {
+    "status": "fulfilled",
+    "result": {
+      "txHash": "0C67CABFC942171919425A1D8A64AB40D4FF5FC49667D0B6B161704DB9C22E0C"
+    }
   }
 }

+ 18 - 0
target_chains/cosmwasm/wormhole-stub/testnet/osmosis_5-2.14.9.json

@@ -18,5 +18,23 @@
     "result": {
       "txHash": "E4CA160348165532DBE7B43C116A801E78FE77122928DB9F9D4DB41514F53F53"
     }
+  },
+  "GUARDIAN_SET_UPGRADE_1_VAA": {
+    "status": "fulfilled",
+    "result": {
+      "txHash": "0C75CE16C91F32A902E43A6326B63800DA5182EFC52AA245E101C6374E3671B1"
+    }
+  },
+  "GUARDIAN_SET_UPGRADE_2_VAA": {
+    "status": "fulfilled",
+    "result": {
+      "txHash": "F58EF5AC1A1941362339A2355F2A2DD44BF46522C37E3D60602C0E731B36F0B6"
+    }
+  },
+  "GUARDIAN_SET_UPGRADE_3_VAA": {
+    "status": "fulfilled",
+    "result": {
+      "txHash": "59984BB3216E6A7D44501B11EE1F51735E9DE9C8D24D87343B9DDB480F3B5ED3"
+    }
   }
 }

+ 18 - 0
target_chains/cosmwasm/wormhole-stub/testnet/sei_atlantic_2-2.14.9.json

@@ -18,5 +18,23 @@
     "result": {
       "txHash": "3BFF9026BCAF0B08C1A6FDE3F26D051860D21CCCC1DF28D9A09D0C9F570815A0"
     }
+  },
+  "GUARDIAN_SET_UPGRADE_1_VAA": {
+    "status": "fulfilled",
+    "result": {
+      "txHash": "CED60F9D4502BF3FC369048B404DF437349323C5786DF8D1D8E6FDDDBC70E855"
+    }
+  },
+  "GUARDIAN_SET_UPGRADE_2_VAA": {
+    "status": "fulfilled",
+    "result": {
+      "txHash": "A7A5CDDBE806530830B006D1E90F8C152BF4DE50AFC1567EA209FCB0854334C1"
+    }
+  },
+  "GUARDIAN_SET_UPGRADE_3_VAA": {
+    "status": "fulfilled",
+    "result": {
+      "txHash": "F0C189FDCB03F26568BDA7597C94235C92197D0B1C5591CCD6510F374DF9480D"
+    }
   }
 }

Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff