diff --git a/terra/tools/package-lock.json b/terra/tools/package-lock.json index 7cf6dad0a3..dad4bb31a0 100644 --- a/terra/tools/package-lock.json +++ b/terra/tools/package-lock.json @@ -1,19 +1,22 @@ { - "name": "tools", - "version": "1.0.0", + "name": "@wormhole-foundation/tools-terra", + "version": "0.0.1", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "tools", - "version": "1.0.0", + "name": "@wormhole-foundation/tools-terra", + "version": "0.0.1", "license": "ISC", "dependencies": { "@cosmjs/encoding": "^0.26.2", - "@terra-money/terra.js": "^2.0.11", + "@terra-money/terra.js": "^3.1.3", "dotenv": "^16.0.0", "ethers": "^5.4.4", "yargs": "^17.0.1" + }, + "devDependencies": { + "@types/node": "^20.10.4" } }, "node_modules/@cosmjs/encoding": { @@ -725,12 +728,90 @@ "@ethersproject/strings": "^5.6.0" } }, + "node_modules/@improbable-eng/grpc-web": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/@improbable-eng/grpc-web/-/grpc-web-0.14.1.tgz", + "integrity": "sha512-XaIYuunepPxoiGVLLHmlnVminUGzBTnXr8Wv7khzmLWbNw4TCwJKX09GSMJlKhu/TRk6gms0ySFxewaETSBqgw==", + "dependencies": { + "browser-headers": "^0.4.1" + }, + "peerDependencies": { + "google-protobuf": "^3.14.0" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@terra-money/legacy.proto": { + "name": "@terra-money/terra.proto", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@terra-money/terra.proto/-/terra.proto-0.1.7.tgz", + "integrity": "sha512-NXD7f6pQCulvo6+mv6MAPzhOkUzRjgYVuHZE/apih+lVnPG5hDBU0rRYnOGGofwvKT5/jQoOENnFn/gioWWnyQ==", + "dependencies": { + "google-protobuf": "^3.17.3", + "long": "^4.0.0", + "protobufjs": "~6.11.2" + } + }, "node_modules/@terra-money/terra.js": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@terra-money/terra.js/-/terra.js-2.0.11.tgz", - "integrity": "sha512-33MrW3SGEmbHzjAA93dw1VA6IKbp6gYJbOTUkQzQbi+msIUf4m9ZewB6v5b8UZJfTfEe/T5RjXCWQHmANsz11w==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@terra-money/terra.js/-/terra.js-3.1.3.tgz", + "integrity": "sha512-80HU5WXrqf3hZTo2GRhIycH17A+SkLD6afbu8MynMDGGD/A861F3zVv6NQ/Z7PWQGHxgddZEK/A0UQ2uK/xfHg==", "dependencies": { - "axios": "^0.21.1", + "@terra-money/legacy.proto": "npm:@terra-money/terra.proto@^0.1.7", + "@terra-money/terra.proto": "~2.0.0", + "axios": "^0.26.1", "bech32": "^2.0.0", "bip32": "^2.0.6", "bip39": "^3.0.3", @@ -741,16 +822,35 @@ "secp256k1": "^4.0.2", "tmp": "^0.2.1", "utf-8-validate": "^5.0.5", - "ws": "^7.4.2" + "ws": "^7.5.5" }, "engines": { - "node": ">=12" + "node": ">=14" } }, + "node_modules/@terra-money/terra.proto": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@terra-money/terra.proto/-/terra.proto-2.0.0.tgz", + "integrity": "sha512-ZjyFOFUzrGn8IwzGIgr1OJFcPSsQoz/XAfoSKThJx+OjJA7CLhdcz51+5h7ehNfb+qB9wr7aNME0h24wu9D4SQ==", + "dependencies": { + "@improbable-eng/grpc-web": "^0.14.1", + "google-protobuf": "^3.17.3", + "long": "^4.0.0", + "protobufjs": "~6.11.2" + } + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, "node_modules/@types/node": { - "version": "10.12.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", - "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==" + "version": "20.10.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz", + "integrity": "sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==", + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/aes-js": { "version": "3.0.0", @@ -780,11 +880,11 @@ } }, "node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", + "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", "dependencies": { - "follow-redirects": "^1.14.0" + "follow-redirects": "^1.14.8" } }, "node_modules/balanced-match": { @@ -849,6 +949,11 @@ "node": ">=6.0.0" } }, + "node_modules/bip32/node_modules/@types/node": { + "version": "10.12.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", + "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==" + }, "node_modules/bip39": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.4.tgz", @@ -884,6 +989,11 @@ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, + "node_modules/browser-headers": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/browser-headers/-/browser-headers-0.4.1.tgz", + "integrity": "sha512-CA9hsySZVo9371qEHjHZtYxV2cFtVj5Wj/ZHi8ooEsrtm4vOnl9Y9HmyYWk9q+05d7K3rdoAE0j3MVEFVvtQtg==" + }, "node_modules/bs58": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", @@ -1072,9 +1182,9 @@ "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" }, "node_modules/follow-redirects": { - "version": "1.14.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", - "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==", + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", "funding": [ { "type": "individual", @@ -1122,6 +1232,11 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/google-protobuf": { + "version": "3.21.2", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz", + "integrity": "sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==" + }, "node_modules/hash-base": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", @@ -1189,6 +1304,11 @@ "jscrypto": "bin/cli.js" } }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, "node_modules/md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -1271,6 +1391,31 @@ "node": ">=0.12" } }, + "node_modules/protobufjs": { + "version": "6.11.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", + "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -1442,6 +1587,11 @@ "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz", "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==" }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, "node_modules/utf-8-validate": { "version": "5.0.6", "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.6.tgz", @@ -1489,9 +1639,9 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "node_modules/ws": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz", - "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==", + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", "engines": { "node": ">=8.3.0" }, @@ -1942,12 +2092,86 @@ "@ethersproject/strings": "^5.6.0" } }, + "@improbable-eng/grpc-web": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/@improbable-eng/grpc-web/-/grpc-web-0.14.1.tgz", + "integrity": "sha512-XaIYuunepPxoiGVLLHmlnVminUGzBTnXr8Wv7khzmLWbNw4TCwJKX09GSMJlKhu/TRk6gms0ySFxewaETSBqgw==", + "requires": { + "browser-headers": "^0.4.1" + } + }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "requires": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "@terra-money/legacy.proto": { + "version": "npm:@terra-money/terra.proto@0.1.7", + "resolved": "https://registry.npmjs.org/@terra-money/terra.proto/-/terra.proto-0.1.7.tgz", + "integrity": "sha512-NXD7f6pQCulvo6+mv6MAPzhOkUzRjgYVuHZE/apih+lVnPG5hDBU0rRYnOGGofwvKT5/jQoOENnFn/gioWWnyQ==", + "requires": { + "google-protobuf": "^3.17.3", + "long": "^4.0.0", + "protobufjs": "~6.11.2" + } + }, "@terra-money/terra.js": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@terra-money/terra.js/-/terra.js-2.0.11.tgz", - "integrity": "sha512-33MrW3SGEmbHzjAA93dw1VA6IKbp6gYJbOTUkQzQbi+msIUf4m9ZewB6v5b8UZJfTfEe/T5RjXCWQHmANsz11w==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@terra-money/terra.js/-/terra.js-3.1.3.tgz", + "integrity": "sha512-80HU5WXrqf3hZTo2GRhIycH17A+SkLD6afbu8MynMDGGD/A861F3zVv6NQ/Z7PWQGHxgddZEK/A0UQ2uK/xfHg==", "requires": { - "axios": "^0.21.1", + "@terra-money/legacy.proto": "npm:@terra-money/terra.proto@^0.1.7", + "@terra-money/terra.proto": "~2.0.0", + "axios": "^0.26.1", "bech32": "^2.0.0", "bip32": "^2.0.6", "bip39": "^3.0.3", @@ -1958,13 +2182,32 @@ "secp256k1": "^4.0.2", "tmp": "^0.2.1", "utf-8-validate": "^5.0.5", - "ws": "^7.4.2" + "ws": "^7.5.5" + } + }, + "@terra-money/terra.proto": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@terra-money/terra.proto/-/terra.proto-2.0.0.tgz", + "integrity": "sha512-ZjyFOFUzrGn8IwzGIgr1OJFcPSsQoz/XAfoSKThJx+OjJA7CLhdcz51+5h7ehNfb+qB9wr7aNME0h24wu9D4SQ==", + "requires": { + "@improbable-eng/grpc-web": "^0.14.1", + "google-protobuf": "^3.17.3", + "long": "^4.0.0", + "protobufjs": "~6.11.2" } }, + "@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, "@types/node": { - "version": "10.12.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", - "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==" + "version": "20.10.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz", + "integrity": "sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==", + "requires": { + "undici-types": "~5.26.4" + } }, "aes-js": { "version": "3.0.0", @@ -1985,11 +2228,11 @@ } }, "axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", + "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", "requires": { - "follow-redirects": "^1.14.0" + "follow-redirects": "^1.14.8" } }, "balanced-match": { @@ -2035,6 +2278,13 @@ "tiny-secp256k1": "^1.1.3", "typeforce": "^1.11.5", "wif": "^2.0.6" + }, + "dependencies": { + "@types/node": { + "version": "10.12.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", + "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==" + } } }, "bip39": { @@ -2074,6 +2324,11 @@ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, + "browser-headers": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/browser-headers/-/browser-headers-0.4.1.tgz", + "integrity": "sha512-CA9hsySZVo9371qEHjHZtYxV2cFtVj5Wj/ZHi8ooEsrtm4vOnl9Y9HmyYWk9q+05d7K3rdoAE0j3MVEFVvtQtg==" + }, "bs58": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", @@ -2239,9 +2494,9 @@ "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" }, "follow-redirects": { - "version": "1.14.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", - "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==" + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==" }, "fs.realpath": { "version": "1.0.0", @@ -2266,6 +2521,11 @@ "path-is-absolute": "^1.0.0" } }, + "google-protobuf": { + "version": "3.21.2", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz", + "integrity": "sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==" + }, "hash-base": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", @@ -2324,6 +2584,11 @@ "resolved": "https://registry.npmjs.org/jscrypto/-/jscrypto-1.0.2.tgz", "integrity": "sha512-r+oNJLGTv1nkNMBBq3c70xYrFDgJOYVgs2OHijz5Ht+0KJ0yObD0oYxC9mN72KLzVfXw+osspg6t27IZvuTUxw==" }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -2392,6 +2657,26 @@ "sha.js": "^2.4.8" } }, + "protobufjs": { + "version": "6.11.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", + "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + } + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -2517,6 +2802,11 @@ "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz", "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==" }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, "utf-8-validate": { "version": "5.0.6", "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.6.tgz", @@ -2554,9 +2844,9 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "ws": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz", - "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==", + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", "requires": {} }, "y18n": { diff --git a/terra/tools/package.json b/terra/tools/package.json index 4a2a4963d2..bc194c951e 100644 --- a/terra/tools/package.json +++ b/terra/tools/package.json @@ -11,9 +11,12 @@ "license": "ISC", "dependencies": { "@cosmjs/encoding": "^0.26.2", - "@terra-money/terra.js": "^2.0.11", + "@terra-money/terra.js": "^3.1.3", "dotenv": "^16.0.0", "ethers": "^5.4.4", "yargs": "^17.0.1" + }, + "devDependencies": { + "@types/node": "^20.10.4" } } diff --git a/terra/tools/test_interface_update.ts b/terra/tools/test_interface_update.ts new file mode 100644 index 0000000000..9cce164bca --- /dev/null +++ b/terra/tools/test_interface_update.ts @@ -0,0 +1,607 @@ +// Run with MNEMONIC="" npx tsx test_interface_update.ts + +// The intention of this script is to test the CW < 1 migration to CW > 1. +// 1. Instantiate new core and token bridge contracts from the existing Code IDs, using the devnet Guardian key. +// 2. Migrate those contracts to the same code IDs, triggering any migration-specific effect they may have had. +// 3. Register a foreign bridge and asset. +// 4. Send a foreign asset in and out. (actually, can't create a foreign asset so nvm) +// 5. Store the updated CW > 1 code to new code IDs. +// 6. Upgrade the contracts to the new code IDs. +// 7. Upgrade the contracts to the new code IDs again. +// 8. Send the foreign asset from step 4 in and out again. +// 9. Register another foreign bridge and asset. +// 10. Send a new foreign asset in and out. (skipping since 8 was new anyway due to being unable to complete 4) +// 11. Attest a native token. +// 12. Deposit and withdraw a native token. (This is broken in mainnet, but should be fixed with this upgrade.) +// 13. Send a native token out and back. (This is broken in mainnet, but should be fixed with this upgrade.) + +import "dotenv/config"; +import { + Fee, + LCDClient, + MnemonicKey, + MsgUpdateContractAdmin, +} from "@terra-money/terra.js"; +import { + MsgInstantiateContract, + MsgExecuteContract, + MsgStoreCode, +} from "@terra-money/terra.js"; +import { readFileSync } from "fs"; +import { Bech32, toHex } from "@cosmjs/encoding"; +import { zeroPad } from "ethers/lib/utils.js"; + +// gas estimation wasn't working, so you'll find many hardcoded values in here +// YMMV + +function sleep(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +// look, broadcast and broadcastBlock still resulted in sequence mismatches +// and nobody has time for that +async function broadcastAndWait(terra, tx) { + const response = await terra.tx.broadcast(tx); + if (response?.code !== 0) { + console.error(response); + throw new Error( + `Transaction failed https://finder.terraclassic.community/mainnet/tx/${response?.txhash}` + ); + } + let currentHeight = (await terra.tendermint.blockInfo()).block.header.height; + while (currentHeight <= response.height) { + await sleep(100); + currentHeight = (await terra.tendermint.blockInfo()).block.header.height; + } + return response; +} + +// Terra addresses are "human-readable", but for cross-chain registrations, we +// want the "canonical" version +function convert_terra_address_to_hex(human_addr) { + return "0x" + toHex(zeroPad(Bech32.decode(human_addr).data, 32)); +} + +async function submitCoreBridgeVAA(vaa: string) { + const tx = await wallet.createAndSignTx({ + msgs: [ + new MsgExecuteContract(wallet.key.accAddress, addressCoreBridge, { + submit_v_a_a: { + vaa: Buffer.from(vaa, "hex").toString("base64"), + }, + }), + ], + memo: "", + fee: new Fee(1000000, { uluna: 50_000_000 }), + }); + const response = await broadcastAndWait(terra, tx); + return response?.txhash; +} + +async function submitTokenBridgeVAA(vaa: string) { + const tx = await wallet.createAndSignTx({ + msgs: [ + new MsgExecuteContract(wallet.key.accAddress, addressTokenBridge, { + submit_vaa: { + data: Buffer.from(vaa, "hex").toString("base64"), + }, + }), + ], + memo: "", + fee: new Fee(1000000, { uluna: 50_000_000 }), + }); + const response = await broadcastAndWait(terra, tx); + return response?.txhash; +} + +/* Set up terra client & wallet */ + +const terra = new LCDClient({ + URL: "https://terra-classic-lcd.publicnode.com", + chainID: "columbus-5", + isClassic: false, +}); + +if (!process.env.MNEMONIC) { + throw new Error("MNEMONIC is required"); +} +const wallet = terra.wallet( + new MnemonicKey({ + mnemonic: process.env.MNEMONIC, + }) +); + +const existingCodeIds = { + "wormhole.wasm": 557, // current wasm + "token_bridge_terra.wasm": 6097, // current wasm + "cw20_wrapped.wasm": 767, // current wasm +}; + +// default addresses from first run +let addressCoreBridge: string = + "terra1u5t6m3049dyqnspekjjt8p73ulkp759cyj796ld057md8zj4vnms4swc7n"; +let addressTokenBridge: string = + "terra186p2npg6fss9c4td5s9dmd62nghvy7j9vausj7yzysynzjjwtltqkhxczn"; + +async function step1() { + const govChain = 1; + const govAddress = + "0000000000000000000000000000000000000000000000000000000000000004"; + async function instantiate(contract, inst_msg, label) { + var address; + await wallet + .createAndSignTx({ + msgs: [ + new MsgInstantiateContract( + wallet.key.accAddress, + wallet.key.accAddress, + existingCodeIds[contract], + inst_msg, + undefined, + label + ), + ], + memo: "", + fee: new Fee(5000000, { uluna: 200_000_000 }), + }) + .then((tx) => broadcastAndWait(terra, tx)) + .then((rs) => { + address = /"_contract_address","value":"([^"]+)/gm.exec( + rs.raw_log + )?.[1]; + }); + console.log( + `Instantiated ${contract} at ${address} (${convert_terra_address_to_hex( + address + )})` + ); + return address; + } + + // devnet guardian public key + const init_guardians = ["beFA429d57cD18b7F8A4d91A2da9AB4AF05d0FBe"]; + + addressCoreBridge = await instantiate( + "wormhole.wasm", + { + gov_chain: govChain, + gov_address: Buffer.from(govAddress, "hex").toString("base64"), + guardian_set_expirity: 86400, + initial_guardian_set: { + addresses: init_guardians.map((hex) => { + return { + bytes: Buffer.from(hex, "hex").toString("base64"), + }; + }), + expiration_time: 0, + }, + }, + "wormholeTest" + ); + + addressTokenBridge = await instantiate( + "token_bridge_terra.wasm", + { + gov_chain: govChain, + gov_address: Buffer.from(govAddress, "hex").toString("base64"), + wormhole_contract: addressCoreBridge, + wrapped_asset_code_id: existingCodeIds["cw20_wrapped.wasm"], + }, + "tokenBridgeTest" + ); +} + +async function step2() { + async function updateAdmin(contract: string) { + const tx = await wallet.createAndSignTx({ + msgs: [ + new MsgUpdateContractAdmin(wallet.key.accAddress, contract, contract), + ], + memo: "", + fee: new Fee(200000, { uluna: 10_000_000 }), + }); + const response = await broadcastAndWait(terra, tx); + console.log( + `Updated ${contract} admin to itself https://finder.terraclassic.community/mainnet/tx/${response?.txhash}` + ); + } + await updateAdmin(addressCoreBridge); + await updateAdmin(addressTokenBridge); + + { + // worm generate upgrade -c terra -a 557 -m Core -g cfb12303a19cde580bb4dd771639b0d26bc68353645571a8cff516ab2ee113a0 + const upgradeCoreVaa = + "01000000000100873cedead0c5a60da23bc23b3705e3b5b0600630d61a955c308307565e54b0cc14914495fc0eb39aee667f81adde5f49aec8bb774bb34121130e24ad6ecacb4c000000000100000001000100000000000000000000000000000000000000000000000000000000000000040000000005300d3f0000000000000000000000000000000000000000000000000000000000436f7265010003000000000000000000000000000000000000000000000000000000000000022d"; + const txhash = await submitCoreBridgeVAA(upgradeCoreVaa); + console.log( + `Upgraded core bridge https://finder.terraclassic.community/mainnet/tx/${txhash}` + ); + } + + { + // worm generate upgrade -c terra -a 6097 -m TokenBridge -g cfb12303a19cde580bb4dd771639b0d26bc68353645571a8cff516ab2ee113a0 + const upgradeTokenBridgeVaa = + "01000000000100c6267b6d66e0ff7fd1b625a94402a5c3ea04cbda7157ab42e172a5844f0cdc495e327c9e1cb9acf2f6c07597d8e746f593253cdaed451994765de1b8ae6fc3d9010000000100000001000100000000000000000000000000000000000000000000000000000000000000040000000001be411000000000000000000000000000000000000000000000546f6b656e42726964676502000300000000000000000000000000000000000000000000000000000000000017d1"; + // Unable to run this... 'failed to execute message; message index: 0: Generic error: Querier contract error: codespace: wasm, code: 9: execute wasm contract failed' + // const txhash = await submitTokenBridgeVAA(upgradeCoreVaa); + // console.log( + // `Upgraded token bridge https://finder.terraclassic.community/mainnet/tx/${txhash}` + // ); + } +} + +async function step3() { + { + // Avalanche mainnet token bridge registration + // worm generate registration -c avalanche -a 0e082F06FF657D94310cB8cE8B0D9a04541d8052 -m TokenBridge -g cfb12303a19cde580bb4dd771639b0d26bc68353645571a8cff516ab2ee113a0 + const registerAvalanche = + "010000000001000f4c334aad9d3a3a9025654bdc5b6c544962683d3be6f616e2e8bdb4f0c2d292423c12b62ea1761c208fb2f3c3734dc25110d7ec7bed9d5db64f2f4babd17eaf010000000100000001000100000000000000000000000000000000000000000000000000000000000000040000000002cb3d3900000000000000000000000000000000000000000000546f6b656e42726964676501000000060000000000000000000000000e082f06ff657d94310cb8ce8b0d9a04541d8052"; + const txhash = await submitTokenBridgeVAA(registerAvalanche); + console.log( + `Registered Avalanche https://finder.terraclassic.community/mainnet/tx/${txhash}` + ); + } + { + // WAVAX attestation + // worm edit-vaa -v AQAAAAMNAaDxJk8ByJTD1FsV4F2ZHyoV1/ZgDvhf+CsKmVTXt5PsdmTurfZKrcr752G94X6ghbT46rxr0bPy4NkoX7MKQJwAAk/crb5HuZnwmD+C6MFIeIBySqvxDQ/mssXHthZrQFsyLvmGZ8COYM9lZEb9pCoiBxuni4pG8gfSH/hEbIkLfX8AA43O2Ymg124dnkzw1E3dIhMt0qKMJozhXdzL/09cB4aJDWX5qxColViikLBqFqM/H/TUasl6Mq2Adhxb6U0h9LEABHAKcM3HK4mPKvPO/tLHW1obzvfp1Dr9QnrkXa+Nh9NMCzHI/JjaUxqUv+9CWntOX3UkGhSkcG0OnjWT79Z1B6kBBd1hBteD0zsrftlGvKzBC9uK3tJ6qwC/YOt0G5criYsqetYTgYnXpZiNrUBdKsqloNUpYHkkE/ieDDFUYxu8IwQAB6NfbF5YrI97b8EoQpz6IW93rJyymNFjYZpFQ3g4gDnoNQpqU0x6xH9NAVq1jJa1sdXjqFnDFDIPJxVHZvX0nAkBCl+kaIABlDgB2TyYvNop2DHKdLj1/NFVqspxg2OZ+PFpcYWZnhIJpNR2YTS7fppI9chxGGoVaoF2ufGAA155kiYAC/2UFf45V9DrsDiW5oJd74PXz3GvbB7G78me4NBYTlZ6E2U9RUQ8ib2W2G7NyQAh2rA/0v9oVbFMOjHaovp4E0kADIUXrdHj7UphaDMNVmFI8uPbLTNHh1j0yweg9TorA3i9QVG++wJ8mFW/+qCMhcw4M5MkJKhbohEQSTdiENir/hkBDgmH2Mb76kLUpy72LBbuQmbzTxb/72PRSqIpMLQzaCbmMGlpUaK3vgZETvUZjjBgt4pMDzki6KjZ67bXhp8FsFoAD/VLPF3juH6/5ulXqmMKP3VJts/ZTzhvn7yRV+YA5YjXUdzUh3pYbraURIsrXvJKzp9+bLzLh2OX/8XRU3bPfLgAEBhwvU9CUEiZ5+3jwSEl3u7rF7ADfUCFeSc/Tb46brgtZNf06ps56C9GKa/c6pSIXEKFjm6AyptXkCeIA9/MdioBEZcYyMrEYkW+gUFGCAaoSSyQmdTmydElc514U3inTM9FETZNTCFmxK/5VHnbEgLKBiDCXL6VDqr8pqBe5DzPxtoAZXIwrDh5AAAABgAAAAAAAAAAAAAAAA4ILwb/ZX2UMQy4zosNmgRUHYBSAAAAAAABqd0BAgAAAAAAAAAAAAAAALMfZqo8HnhTY/CHWht04nuF/WbHAAYSV0FWQVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXcmFwcGVkIEFWQVgAAAAAAAAAAAAAAAAAAAAAAAAAAA== --gs cfb12303a19cde580bb4dd771639b0d26bc68353645571a8cff516ab2ee113a0 + const wavaxAttestation = + "01000000000100b1cc54a6b6a3ee8baadc39f7f59b6074ae647d811ffb3deac1036231dfdc26f02a0e6fa6033f549efc358e7443d979bd261ab3ad8f74ce6f90c14cb136a6832701657230ac3879000000060000000000000000000000000e082f06ff657d94310cb8ce8b0d9a04541d8052000000000001a9dd0102000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c700061257415641580000000000000000000000000000000000000000000000000000005772617070656420415641580000000000000000000000000000000000000000"; + // Unable to run this... 'failed to execute message; message index: 0: dispatch: submessages: label is required: invalid request' + // const txhash = await submitTokenBridgeVAA(wavaxAttestation); + // console.log( + // `Created WAVAX https://finder.terraclassic.community/mainnet/tx/${txhash}` + // ); + } +} + +async function step4() { + // cannot complete step 4 since unable to create the wrapped asset on the existing implementation +} + +// default code id from first run +let newCodeIdCoreBridge: number = 8333; +let newCodeIdTokenBridge: number = 8334; + +async function step5() { + async function deployCode(file: string) { + const contract_bytes = readFileSync(`../artifacts/${file}`); + console.log(`Storing WASM: ${file} (${contract_bytes.length} bytes)`); + + const store_code = new MsgStoreCode( + wallet.key.accAddress, + contract_bytes.toString("base64") + ); + + const tx = await wallet.createAndSignTx({ + msgs: [store_code], + memo: "", + fee: new Fee(5000000, { uluna: 200_000_000 }), + }); + + const rs = await broadcastAndWait(terra, tx); + console.log(rs.raw_log); + console.log( + `Deployed ${file} https://finder.terraclassic.community/mainnet/tx/${rs?.txhash}` + ); + const ci = /"code_id","value":"([^"]+)/gm.exec(rs.raw_log)?.[1]; + if (!ci) { + throw new Error("Could not parse code ID from raw_log"); + } + return parseInt(ci); + } + + newCodeIdCoreBridge = await deployCode("wormhole.wasm"); + newCodeIdTokenBridge = await deployCode("token_bridge_terra.wasm"); +} + +async function step6() { + { + // worm generate upgrade -c terra -a 8333 -m Core -g cfb12303a19cde580bb4dd771639b0d26bc68353645571a8cff516ab2ee113a0 + const upgradeCoreVaa = + "01000000000100a5b2ae692d6398838a3c08a3054edfbe9f1d01b4ddc0547c43a7f0b8069f20c12f0dc98202d54bea38c29356bd075cff21a2335cb8c75af689c12db8f2b328b40100000001000000010001000000000000000000000000000000000000000000000000000000000000000400000000015a73fa0000000000000000000000000000000000000000000000000000000000436f7265010003000000000000000000000000000000000000000000000000000000000000208d"; + const txhash = await submitCoreBridgeVAA(upgradeCoreVaa); + console.log( + `Upgraded core bridge https://finder.terraclassic.community/mainnet/tx/${txhash}` + ); + } + + { + // worm generate upgrade -c terra -a 8334 -m TokenBridge -g cfb12303a19cde580bb4dd771639b0d26bc68353645571a8cff516ab2ee113a0 + const upgradeTokenBridgeVaa = + "010000000001005ab927266b7ed6e35901c4184ab42287d2e2dd209e491102210fccf5448d770f74c21a35f222e29cfd3fffa3be6e00eb140c15a557f2497766bbac7bec1a041e000000000100000001000100000000000000000000000000000000000000000000000000000000000000040000000000abd77600000000000000000000000000000000000000000000546f6b656e427269646765020003000000000000000000000000000000000000000000000000000000000000208e"; + const txhash = await submitTokenBridgeVAA(upgradeTokenBridgeVaa); + console.log( + `Upgraded token bridge https://finder.terraclassic.community/mainnet/tx/${txhash}` + ); + } +} + +async function step7() { + { + // worm generate upgrade -c terra -a 8333 -m Core -g cfb12303a19cde580bb4dd771639b0d26bc68353645571a8cff516ab2ee113a0 + const upgradeCoreVaa = + "0100000000010057c3d1727b5acca25a8a5a1ae31f09cf39fa7e01270c145df8fde315f9c7c0ac08c72b4911bc4ea75d18a97a50157c3dc065f1e91438e8060ea376fc7a562f6e0000000001000000010001000000000000000000000000000000000000000000000000000000000000000400000000051078710000000000000000000000000000000000000000000000000000000000436f7265010003000000000000000000000000000000000000000000000000000000000000208d"; + const txhash = await submitCoreBridgeVAA(upgradeCoreVaa); + console.log( + `Upgraded core bridge https://finder.terraclassic.community/mainnet/tx/${txhash}` + ); + } + + { + // worm generate upgrade -c terra -a 8334 -m TokenBridge -g cfb12303a19cde580bb4dd771639b0d26bc68353645571a8cff516ab2ee113a0 + const upgradeTokenBridgeVaa = + "010000000001002c7e1404f1451a19f03f2b3e180ab60a11427c289b2e1a8d19067f4c1378114c40460aea7b04299cc6a4d15c3840108f463b4f62bf84b7f552b8ede08a80ecb60100000001000000010001000000000000000000000000000000000000000000000000000000000000000400000000042b8c3a00000000000000000000000000000000000000000000546f6b656e427269646765020003000000000000000000000000000000000000000000000000000000000000208e"; + const txhash = await submitTokenBridgeVAA(upgradeTokenBridgeVaa); + console.log( + `Upgraded token bridge https://finder.terraclassic.community/mainnet/tx/${txhash}` + ); + } +} + +async function step8a() { + { + // WAVAX attestation + // worm edit-vaa -v AQAAAAMNAaDxJk8ByJTD1FsV4F2ZHyoV1/ZgDvhf+CsKmVTXt5PsdmTurfZKrcr752G94X6ghbT46rxr0bPy4NkoX7MKQJwAAk/crb5HuZnwmD+C6MFIeIBySqvxDQ/mssXHthZrQFsyLvmGZ8COYM9lZEb9pCoiBxuni4pG8gfSH/hEbIkLfX8AA43O2Ymg124dnkzw1E3dIhMt0qKMJozhXdzL/09cB4aJDWX5qxColViikLBqFqM/H/TUasl6Mq2Adhxb6U0h9LEABHAKcM3HK4mPKvPO/tLHW1obzvfp1Dr9QnrkXa+Nh9NMCzHI/JjaUxqUv+9CWntOX3UkGhSkcG0OnjWT79Z1B6kBBd1hBteD0zsrftlGvKzBC9uK3tJ6qwC/YOt0G5criYsqetYTgYnXpZiNrUBdKsqloNUpYHkkE/ieDDFUYxu8IwQAB6NfbF5YrI97b8EoQpz6IW93rJyymNFjYZpFQ3g4gDnoNQpqU0x6xH9NAVq1jJa1sdXjqFnDFDIPJxVHZvX0nAkBCl+kaIABlDgB2TyYvNop2DHKdLj1/NFVqspxg2OZ+PFpcYWZnhIJpNR2YTS7fppI9chxGGoVaoF2ufGAA155kiYAC/2UFf45V9DrsDiW5oJd74PXz3GvbB7G78me4NBYTlZ6E2U9RUQ8ib2W2G7NyQAh2rA/0v9oVbFMOjHaovp4E0kADIUXrdHj7UphaDMNVmFI8uPbLTNHh1j0yweg9TorA3i9QVG++wJ8mFW/+qCMhcw4M5MkJKhbohEQSTdiENir/hkBDgmH2Mb76kLUpy72LBbuQmbzTxb/72PRSqIpMLQzaCbmMGlpUaK3vgZETvUZjjBgt4pMDzki6KjZ67bXhp8FsFoAD/VLPF3juH6/5ulXqmMKP3VJts/ZTzhvn7yRV+YA5YjXUdzUh3pYbraURIsrXvJKzp9+bLzLh2OX/8XRU3bPfLgAEBhwvU9CUEiZ5+3jwSEl3u7rF7ADfUCFeSc/Tb46brgtZNf06ps56C9GKa/c6pSIXEKFjm6AyptXkCeIA9/MdioBEZcYyMrEYkW+gUFGCAaoSSyQmdTmydElc514U3inTM9FETZNTCFmxK/5VHnbEgLKBiDCXL6VDqr8pqBe5DzPxtoAZXIwrDh5AAAABgAAAAAAAAAAAAAAAA4ILwb/ZX2UMQy4zosNmgRUHYBSAAAAAAABqd0BAgAAAAAAAAAAAAAAALMfZqo8HnhTY/CHWht04nuF/WbHAAYSV0FWQVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXcmFwcGVkIEFWQVgAAAAAAAAAAAAAAAAAAAAAAAAAAA== --gs cfb12303a19cde580bb4dd771639b0d26bc68353645571a8cff516ab2ee113a0 + const wavaxAttestation = + "01000000000100b1cc54a6b6a3ee8baadc39f7f59b6074ae647d811ffb3deac1036231dfdc26f02a0e6fa6033f549efc358e7443d979bd261ab3ad8f74ce6f90c14cb136a6832701657230ac3879000000060000000000000000000000000e082f06ff657d94310cb8ce8b0d9a04541d8052000000000001a9dd0102000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c700061257415641580000000000000000000000000000000000000000000000000000005772617070656420415641580000000000000000000000000000000000000000"; + const txhash = await submitTokenBridgeVAA(wavaxAttestation); + console.log( + `Created WAVAX https://finder.terraclassic.community/mainnet/tx/${txhash}` + ); + } +} + +const wavaxAddress = + "terra17v94nk43tw0wx9r6r8a8kfcya0qazw0n8camypc2qdz4cj6cqajqftzyzh"; + +async function step8b() { + // WAVAX transfer in + // worm edit-vaa -v AQAAAAMNAOoKGMdKp40UoEoAQ0qZXVPawkpV4yZ4qCN7XC9KYV2VLLDcitjwRZ0rWh2xzFZVAntuxTSsl7sXXs5bkdKDNVEBAithN161Hu4+xIo7ADSNMTehvD70vg3bjB7/5cDt+ieYWZNeyhPgGlA/31y2vS5xtRGUOgCHoHVyDGTJ7RqRCpgBA6Z/g3R64BdryeqYDbGytx1uSNT7rbqadNkVb0BZvaJFAE5ITG9GW2bOZIAicg8iOcZw7WYa8a6vmuubKfzYp78BBI8OTu8tW72PzIspTYjEwinm7LpfgQ51ERIkAtFug2tmGZTwGiNRXoZeo9m1XpLgR/U01y6VQrIqUJasamVn6XwABv6qxtZkBfgT0T3nu6HEwv88CYXT/FXAYu/7HOVII/OneQQxIT9OS2BTiuMIWVcuvZ2qP2sdGhtOcX1f4crPCMcAB0yP5J7sQu+D2LDUsYjdELtMtj4KeWtjCkCBR6skWe/8IuRndXFvllNo0GRsB6A3XFnXReadRp5jH4A6t5UzS1UBCG6rkvPMMt7oUdSZBt9Lytd554Q5E310keqAB8+SXFumUY1y17U6KSgfTKgnWZBrTINj1RUw1ew8hElFziUKLDMADZE1+TeCwS+7W/59kz2mxBOgYa63j4pwdsB33BRGRfw9aYSQ3mkszyH+88bIKgjWzhJvRjs622L20QnBIbs5EAABDtf8OfUwbyAeOKM5D6m9pkDMlmz0hNwLa1Iuk2sQjLJsLRtbFYXScfgErmSkIgGGoMRtMt7Hk9pkebaD92skGOkADy10mYk73Lm360c2DZsnTCYsv0rKQ+MMrMverp9d8K5uALqZ3huvhJmTKtpNG/Dpzjsolk2aADcPHuEJudy4ZFEBEA19NY1c97Qo+VMwx3E/B6sEFszT8L93zPYhjBkWsuY9HwSsogKKb84170DApcKiXuz2jhw4e/eStObBBn7gc0AAESW+7FjIHqqFL35z/T+Mpq8lrvaPwiZJnKaMipWzre4RIRrBx/UKhGaADniFOOCc1J2/KMwH6E5WXFbO9pexAkoBEpxYKgkPcldCBmwI96Rk6lul3Rflkj3FrJvVrzJumyBffW+NwSdvFP0QltmzVEN39K9prXttF5bTlxcxaxpFU58AZXI6igwiAAAABgAAAAAAAAAAAAAAAA4ILwb/ZX2UMQy4zosNmgRUHYBSAAAAAAABqe0BAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkAAAAAAAAAAAAAAAAsx9mqjweeFNj8IdaG3Tie4X9ZscABgAAAAAAAAAAAAAAAD1aJY70jTtGjw8Tlz+RsqmlzFPYAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== --gs cfb12303a19cde580bb4dd771639b0d26bc68353645571a8cff516ab2ee113a0 + const wavaxTransfer = + "0100000000010044dd5206ac105e99c39b2a368e510978f1e18cf61bfbfac399244c9bbcf23b3e61bd5e6ca098855263745890bae05e6450a9d4ccdb395ecd01471e5867db738a0065723a8a0c22000000060000000000000000000000000e082f06ff657d94310cb8ce8b0d9a04541d8052000000000001a9ed01010000000000000000000000000000000000000000000000000000000000000064000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c700060000000000000000000000003d5a258ef48d3b468f0f13973f91b2a9a5cc53d800030000000000000000000000000000000000000000000000000000000000000000"; + const txhash = await submitTokenBridgeVAA(wavaxTransfer); + console.log( + `Redeemed WAVAX https://finder.terraclassic.community/mainnet/tx/${txhash}` + ); +} + +async function step8c() { + // WAVAX transfer out + const amount = "100"; + const tx = await wallet.createAndSignTx({ + msgs: [ + new MsgExecuteContract( + wallet.key.accAddress, + wavaxAddress, + { + increase_allowance: { + spender: addressTokenBridge, + amount, + expires: { + never: {}, + }, + }, + }, + {} + ), + new MsgExecuteContract( + wallet.key.accAddress, + addressTokenBridge, + { + initiate_transfer: { + asset: { + amount, + info: { + token: { + contract_addr: wavaxAddress, + }, + }, + }, + recipient_chain: 4, + recipient: Buffer.from( + "0000000000000000000000000000000000000000000000000000000000000000", + "hex" + ).toString("base64"), + fee: "0", + nonce: 0, + }, + }, + {} + ), + ], + memo: "", + fee: new Fee(1000000, { uluna: 50_000_000 }), + }); + const response = await broadcastAndWait(terra, tx); + console.log( + `Transferred WAVAX https://finder.terraclassic.community/mainnet/tx/${response?.txhash}` + ); +} + +async function step9() { + { + // Fantom mainnet token bridge registration + // worm generate registration -c fantom -a 7C9Fc5741288cDFdD83CeB07f3ea7e22618D79D2 -m TokenBridge -g cfb12303a19cde580bb4dd771639b0d26bc68353645571a8cff516ab2ee113a0 + const registerAvalanche = + "01000000000100f4644a32805b1e24eb40d91ffa05196bfa2783c74448070661701db4168a3e55787e1bd1bc4b300309b85990a4a75c8f7ff420c90b5d5a853076e413a02ef98c000000000100000001000100000000000000000000000000000000000000000000000000000000000000040000000004eadf0f00000000000000000000000000000000000000000000546f6b656e427269646765010000000a0000000000000000000000007c9fc5741288cdfdd83ceb07f3ea7e22618d79d2"; + const txhash = await submitTokenBridgeVAA(registerAvalanche); + console.log( + `Registered Fantom https://finder.terraclassic.community/mainnet/tx/${txhash}` + ); + } + { + // WFTM attestation + // worm edit-vaa -v AQAAAAMNAGZLTJJ7k9izhrCiPU4vVY7CYp2c5592bObi2AKLGlj4CCxEGiQMva1F92+4kiX96CQoHG6iGSLX/uIwWZ0LdxkBAkq/rbbsqsk/Ax1gcowejzzJXgvfuSReU/Ob2sj4om2UY/L5R9b15jNb9uFexIkXitEaMRAzy0pnX1dBHx8ATfkAAyLgNbwTYAuA+sY+99cvm+e7r4V98IgXC4abG18t2K1nR9wxLpUMzNVPqDXVO/nDzvdQGqmHuhsC6IcwBT4CrCIABGWCArnx4DzWkS1Nsr88S7OvVOAWvn7AxTlVo0HT7SSwYhb7TUP2vBwJbA6mC0lK0UeBM3P4yoAKiFwSgqYPaZwABmewrAPd+r8uBGivWWfgsV5MbqwDEPy34mf+4LyhKtlifQc/QA3Mm+ttykD4SBp4ylAbvuwLBu8lqGrlzb/MoIYBBxLvs7gB2//Qx0qbsf7Ujau3g3Ipl1G2KTid1Xbn+5JDXbeJYEZQ3r2oiMB9N7HUNlldVPf3Nxn3oaZRHUvHYJkACzsVuZ0g4d2I2/XlLoanV90ElTFPjfmfe6Yp2Sol4mqOcz1Y+7QNmMm7iaKX9V7zRxvr/h6TWLip/P+mHjHRoywADGY6Vws8S5crT4U38OQoMEt9zFrBi1fttzdzv5P4BBKkWqUGP5ma2QyM39i6sussCgeI5qJae4ro3xXos5Qs218BDfgNXK8IojRwZoL8H+JKVOBv2qVN8rsbIwAN42TM3olCAliJYhhou8iZyjdeztmQRQl+7YESz8DVgLRNYhfPRDQADlQw39Txk19urWtjwb5LgVIWKea8AQqyocY2f3hJqbt9HFzWhR6Ho+gJ/wr7OnVoe9IIn4W5mvyiJYOLrmmNhzgBEEIZ8n6Qevl1+dZR2bdZHn6Cqdk6/UiPcyWmTHrMC8YKD+tKj3eRPHDDldnEJ23tsrtLhiCZm2OhiONefWCv9q8BEQCzPrgDqun4qbYMwAP8Bw8e22fJ5AnCOj6EksJEeYO7Kgwiijbc12wHosCaFD5YZXTqGPJ9zot1XH1tcFzYePABEtMHLrXStHqUtHUaR2KtRTKOL71Yy89SY8lEe70JJw9lVMJggnBVTPAdjic/frvLXFOZWgHmVYxz3fCIJWb0EboAZXMyeXI3AAAACgAAAAAAAAAAAAAAAHyfxXQSiM392DzrB/PqfiJhjXnSAAAAAAAAe34BAgAAAAAAAAAAAAAAACG+Nw1TEvRMtCzjd7ybigzvGkyDAAoSV0ZUTQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXcmFwcGVkIEZhbnRvbQAAAAAAAAAAAAAAAAAAAAAAAA== --gs cfb12303a19cde580bb4dd771639b0d26bc68353645571a8cff516ab2ee113a0 + const wftmAttestation = + "01000000000100bc136a00a448e2cc01ae1b81ca9d37a301a98fa906893b0735817b79d614b8bb3ede50f3d125bf581bff3640abc4b9ca83171c5e7ff7963f4a9a5517b6cb0009006573327972370000000a0000000000000000000000007c9fc5741288cdfdd83ceb07f3ea7e22618d79d20000000000007b7e010200000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83000a125746544d00000000000000000000000000000000000000000000000000000000577261707065642046616e746f6d000000000000000000000000000000000000"; + const txhash = await submitTokenBridgeVAA(wftmAttestation); + console.log( + `Created WFTM https://finder.terraclassic.community/mainnet/tx/${txhash}` + ); + } +} + +async function step10() { + // skipping step10 as already covered by 8 +} + +async function step11() { + const tx = await wallet.createAndSignTx({ + msgs: [ + new MsgExecuteContract( + wallet.key.accAddress, + addressTokenBridge, + { + create_asset_meta: { + asset_info: { + native_token: { denom: "uluna" }, + }, + nonce: 0, + }, + }, + {} + ), + ], + memo: "", + fee: new Fee(1000000, { uluna: 50_000_000 }), + }); + const response = await broadcastAndWait(terra, tx); + console.log( + `Attested uluna https://finder.terraclassic.community/mainnet/tx/${response?.txhash}` + ); +} + +async function step12() { + { + const tx = await wallet.createAndSignTx({ + msgs: [ + new MsgExecuteContract( + wallet.key.accAddress, + addressTokenBridge, + { + deposit_tokens: {}, + }, + { uluna: 10000 } + ), + ], + memo: "", + fee: new Fee(200000, { uluna: 10_000_000 }), + }); + const response = await broadcastAndWait(terra, tx); + console.log( + `Deposted uluna https://finder.terraclassic.community/mainnet/tx/${response?.txhash}` + ); + } + { + const tx = await wallet.createAndSignTx({ + msgs: [ + new MsgExecuteContract( + wallet.key.accAddress, + addressTokenBridge, + { + withdraw_tokens: { + asset: { + native_token: { + denom: "uluna", + }, + }, + }, + }, + {} + ), + ], + memo: "", + fee: new Fee(200000, { uluna: 10_000_000 }), + }); + const response = await broadcastAndWait(terra, tx); + console.log( + `Withdrew uluna https://finder.terraclassic.community/mainnet/tx/${response?.txhash}` + ); + } +} + +async function step13() { + { + const tx = await wallet.createAndSignTx({ + msgs: [ + new MsgExecuteContract( + wallet.key.accAddress, + addressTokenBridge, + { + deposit_tokens: {}, + }, + { uluna: 10000 } + ), + new MsgExecuteContract( + wallet.key.accAddress, + addressTokenBridge, + { + initiate_transfer: { + asset: { + amount: "10000", + info: { + native_token: { + denom: "uluna", + }, + }, + }, + recipient_chain: 2, + recipient: Buffer.from( + "0000000000000000000000000000000000000000000000000000000000000000", + "hex" + ).toString("base64"), + fee: "0", + nonce: 1, + }, + }, + {} // no fee? + // { uluna: 10050 } // fee + tax + ), + ], + memo: "", + fee: new Fee(500000, { uluna: 20_000_000 }), + }); + const response = await broadcastAndWait(terra, tx); + console.log( + `Sent uluna https://finder.terraclassic.community/mainnet/tx/${response?.txhash}` + ); + } + + // 10000 uluna from avax to terra classic + { + const transferVAA = + "010000000001002e1a7f786c42d41047bc4a6c55c2210a00dbeae45d43ead884eb42c163a7d72708a089c1e93779adbcf0603fac904a77c47e0c49cd0663ab250c434f6ceeb1f600652719abea95000000060000000000000000000000000e082f06ff657d94310cb8ce8b0d9a04541d80520000000000018b9401010000000000000000000000000000000000000000000000000000000000002710010000000000000000000000000000000000000000000000000000756c756e6100030000000000000000000000003d5a258ef48d3b468f0f13973f91b2a9a5cc53d800030000000000000000000000000000000000000000000000000000000000000000"; + const txhash = await submitTokenBridgeVAA(transferVAA); + console.log( + `Redeemed uluna https://finder.terraclassic.community/mainnet/tx/${txhash}` + ); + } +} + +async function main() { + // await step1(); + console.log( + `Core bridge: https://finder.terraclassic.community/mainnet/address/${addressCoreBridge}` + ); + console.log( + `Token bridge: https://finder.terraclassic.community/mainnet/address/${addressTokenBridge}` + ); + // await step2(); + // await step3(); + // await step4(); + // await step5(); + // console.log(`New core bridge code ID: ${newCodeIdCoreBridge}`); + // console.log(`New token bridge code ID: ${newCodeIdTokenBridge}`); + // await step6(); + // await step7(); + // await step8a(); + // await step8b(); + // await step8c(); + await step9(); + await step10(); + await step11(); + await step12(); + await step13(); +} + +main();