Client/js: Add Info Registrations (#3035)
* Client/js: Add Info Registrations Change-Id: Ib123dfe895d88c5574f575b16dfc3e6775d81f2a * Fix build errors Change-Id: Ifcacb564fc40f14337ab472ece617a2955b579c5
This commit is contained in:
parent
7f74b92721
commit
1ae38c889a
|
@ -10,7 +10,7 @@
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@celo-tools/celo-ethers-wrapper": "^0.1.0",
|
"@celo-tools/celo-ethers-wrapper": "^0.1.0",
|
||||||
"@certusone/wormhole-sdk": "^0.9.16",
|
"@certusone/wormhole-sdk": "^0.9.18",
|
||||||
"@cosmjs/encoding": "^0.26.2",
|
"@cosmjs/encoding": "^0.26.2",
|
||||||
"@injectivelabs/networks": "^1.10.7",
|
"@injectivelabs/networks": "^1.10.7",
|
||||||
"@injectivelabs/sdk-ts": "^1.10.47",
|
"@injectivelabs/sdk-ts": "^1.10.47",
|
||||||
|
@ -492,16 +492,16 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@certusone/wormhole-sdk": {
|
"node_modules/@certusone/wormhole-sdk": {
|
||||||
"version": "0.9.16",
|
"version": "0.9.18",
|
||||||
"resolved": "https://registry.npmjs.org/@certusone/wormhole-sdk/-/wormhole-sdk-0.9.16.tgz",
|
"resolved": "https://registry.npmjs.org/@certusone/wormhole-sdk/-/wormhole-sdk-0.9.18.tgz",
|
||||||
"integrity": "sha512-UFcGvMW6yku0Qz4hyFw0H4IKKlUJ2VHrHo0PnSUOfbBf7RfXHKPE9VxsVeCKILbhBzBmECVVP4xF7WlrBBn8/Q==",
|
"integrity": "sha512-0YtrdZmjfiUHL78Yr4FA59ywb+pIevbID/TJpJTp/EKWqm/v+9PS4YBMBEtjpDZR/PSqe6hB8MasF38fUjMGtQ==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@certusone/wormhole-sdk-proto-web": "0.0.6",
|
"@certusone/wormhole-sdk-proto-web": "0.0.6",
|
||||||
"@certusone/wormhole-sdk-wasm": "^0.0.1",
|
"@certusone/wormhole-sdk-wasm": "^0.0.1",
|
||||||
"@coral-xyz/borsh": "0.2.6",
|
"@coral-xyz/borsh": "0.2.6",
|
||||||
"@injectivelabs/networks": "1.10.7",
|
"@injectivelabs/networks": "1.10.12",
|
||||||
"@injectivelabs/sdk-ts": "1.10.47",
|
"@injectivelabs/sdk-ts": "1.10.72",
|
||||||
"@injectivelabs/utils": "1.10.5",
|
"@injectivelabs/utils": "1.10.12",
|
||||||
"@mysten/sui.js": "0.32.2",
|
"@mysten/sui.js": "0.32.2",
|
||||||
"@project-serum/anchor": "^0.25.0",
|
"@project-serum/anchor": "^0.25.0",
|
||||||
"@solana/spl-token": "^0.3.5",
|
"@solana/spl-token": "^0.3.5",
|
||||||
|
@ -1877,9 +1877,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@injectivelabs/core-proto-ts": {
|
"node_modules/@injectivelabs/core-proto-ts": {
|
||||||
"version": "0.0.12",
|
"version": "0.0.14",
|
||||||
"resolved": "https://registry.npmjs.org/@injectivelabs/core-proto-ts/-/core-proto-ts-0.0.12.tgz",
|
"resolved": "https://registry.npmjs.org/@injectivelabs/core-proto-ts/-/core-proto-ts-0.0.14.tgz",
|
||||||
"integrity": "sha512-axdL+KWuv4aORIdYqJQy5k9H+bPsi5Y4KWNcYPxrFQ0FAu+sjpvm5PmbIzBSgv/hnIB2cHcLuKvE3BtEa3vJ/w==",
|
"integrity": "sha512-NZWlgBzgVrXow9IknFQHvcYKX4QkUD25taRigoNYQK8PDn4+VXd9xM5WFUDRhzm2smTCguyl/+MghpEp4oTPWw==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@injectivelabs/grpc-web": "^0.0.1",
|
"@injectivelabs/grpc-web": "^0.0.1",
|
||||||
"google-protobuf": "^3.14.0",
|
"google-protobuf": "^3.14.0",
|
||||||
|
@ -1916,13 +1916,13 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@injectivelabs/exceptions": {
|
"node_modules/@injectivelabs/exceptions": {
|
||||||
"version": "1.10.5",
|
"version": "1.11.0",
|
||||||
"resolved": "https://registry.npmjs.org/@injectivelabs/exceptions/-/exceptions-1.10.5.tgz",
|
"resolved": "https://registry.npmjs.org/@injectivelabs/exceptions/-/exceptions-1.11.0.tgz",
|
||||||
"integrity": "sha512-jeAa5GL3dbe9vXykzu54RP2RETZ6m92XzOTFWb3F0UgB1GtGEDKoMYxN8CJn9RYz3buCPcHxMi/+og6FHu+RaQ==",
|
"integrity": "sha512-jZ0N4cP1KCyErNEiCARaKt70E8KMTNa9R4a5FrCERX4cFKPxdbWpoQ8Lqga2jfHAgiFcChRJ5JmaSYclFtKf9w==",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@injectivelabs/grpc-web": "^0.0.1",
|
"@injectivelabs/grpc-web": "^0.0.1",
|
||||||
"@injectivelabs/ts-types": "^1.10.4",
|
"@injectivelabs/ts-types": "^1.11.0",
|
||||||
"http-status-codes": "^2.2.0",
|
"http-status-codes": "^2.2.0",
|
||||||
"link-module-alias": "^1.2.0",
|
"link-module-alias": "^1.2.0",
|
||||||
"shx": "^0.3.2"
|
"shx": "^0.3.2"
|
||||||
|
@ -1995,9 +1995,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@injectivelabs/mito-proto-ts": {
|
"node_modules/@injectivelabs/mito-proto-ts": {
|
||||||
"version": "1.0.4",
|
"version": "1.0.9",
|
||||||
"resolved": "https://registry.npmjs.org/@injectivelabs/mito-proto-ts/-/mito-proto-ts-1.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/@injectivelabs/mito-proto-ts/-/mito-proto-ts-1.0.9.tgz",
|
||||||
"integrity": "sha512-8raVmZnaXVbpikMTmnc+OtViBPzgyx2ilezUTZFCNcQzZM01lbJlpd0NbF6K5tG76eJ3Wjwj+YpAdRPNuayZ4A==",
|
"integrity": "sha512-+TZMvJ4SHwcn6SFPdqaiQFZdNhjH7hyRFozY15nOTC2utdGij9jEsjz1NsyOejfYDA0s1z5Wm1SgrMYKaVpAmQ==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@injectivelabs/grpc-web": "^0.0.1",
|
"@injectivelabs/grpc-web": "^0.0.1",
|
||||||
"google-protobuf": "^3.14.0",
|
"google-protobuf": "^3.14.0",
|
||||||
|
@ -2034,22 +2034,22 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@injectivelabs/networks": {
|
"node_modules/@injectivelabs/networks": {
|
||||||
"version": "1.10.7",
|
"version": "1.10.12",
|
||||||
"resolved": "https://registry.npmjs.org/@injectivelabs/networks/-/networks-1.10.7.tgz",
|
"resolved": "https://registry.npmjs.org/@injectivelabs/networks/-/networks-1.10.12.tgz",
|
||||||
"integrity": "sha512-qnU3A7FgTVi4bGEMaSsSIN2wTBhKZfV+3fiwU09aX8ZNcWAilMx8d/mlE1naZFAHs7Kf5hFBxzgeSRZa1GJqiA==",
|
"integrity": "sha512-tTHyLls1Nik5QTs/S03qqG2y/ITvNwI8CJOQbMmmsr1CL2CdjJBtzRYn9Dyx2p8XgzRFf9hmlybpe20tq9O3SA==",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@injectivelabs/exceptions": "^1.10.5",
|
"@injectivelabs/exceptions": "^1.10.12",
|
||||||
"@injectivelabs/ts-types": "^1.10.4",
|
"@injectivelabs/ts-types": "^1.10.12",
|
||||||
"@injectivelabs/utils": "^1.10.5",
|
"@injectivelabs/utils": "^1.10.12",
|
||||||
"link-module-alias": "^1.2.0",
|
"link-module-alias": "^1.2.0",
|
||||||
"shx": "^0.3.2"
|
"shx": "^0.3.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@injectivelabs/sdk-ts": {
|
"node_modules/@injectivelabs/sdk-ts": {
|
||||||
"version": "1.10.47",
|
"version": "1.10.72",
|
||||||
"resolved": "https://registry.npmjs.org/@injectivelabs/sdk-ts/-/sdk-ts-1.10.47.tgz",
|
"resolved": "https://registry.npmjs.org/@injectivelabs/sdk-ts/-/sdk-ts-1.10.72.tgz",
|
||||||
"integrity": "sha512-G11Cdf5iO6is0qWzQRdfiUJLI8IPF4VtD5mVfBwnakrk78syN/Dy492trL7hispDSQaCJaP6a/fa6HnMPCsvzA==",
|
"integrity": "sha512-A5mHNNBgO4fI1c/7CZ0bGfVXliy8laP+VaYZ++aWh1YyudoZw4CTCEmLetZRy7AUU3XcfbHa8sAImRi7db+v6Q==",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@apollo/client": "^3.5.8",
|
"@apollo/client": "^3.5.8",
|
||||||
|
@ -2057,18 +2057,18 @@
|
||||||
"@cosmjs/proto-signing": "^0.30.1",
|
"@cosmjs/proto-signing": "^0.30.1",
|
||||||
"@cosmjs/stargate": "^0.30.1",
|
"@cosmjs/stargate": "^0.30.1",
|
||||||
"@ethersproject/bytes": "^5.7.0",
|
"@ethersproject/bytes": "^5.7.0",
|
||||||
"@injectivelabs/core-proto-ts": "^0.0.12",
|
"@injectivelabs/core-proto-ts": "^0.0.14",
|
||||||
"@injectivelabs/exceptions": "^1.10.5",
|
"@injectivelabs/exceptions": "^1.10.12",
|
||||||
"@injectivelabs/grpc-web": "^0.0.1",
|
"@injectivelabs/grpc-web": "^0.0.1",
|
||||||
"@injectivelabs/grpc-web-node-http-transport": "^0.0.2",
|
"@injectivelabs/grpc-web-node-http-transport": "^0.0.2",
|
||||||
"@injectivelabs/grpc-web-react-native-transport": "^0.0.2",
|
"@injectivelabs/grpc-web-react-native-transport": "^0.0.2",
|
||||||
"@injectivelabs/indexer-proto-ts": "1.10.8-rc.4",
|
"@injectivelabs/indexer-proto-ts": "1.10.8-rc.4",
|
||||||
"@injectivelabs/mito-proto-ts": "1.0.4",
|
"@injectivelabs/mito-proto-ts": "1.0.9",
|
||||||
"@injectivelabs/networks": "^1.10.7",
|
"@injectivelabs/networks": "^1.10.12",
|
||||||
"@injectivelabs/test-utils": "^1.10.2",
|
"@injectivelabs/test-utils": "^1.10.12",
|
||||||
"@injectivelabs/token-metadata": "^1.10.25",
|
"@injectivelabs/token-metadata": "^1.10.42",
|
||||||
"@injectivelabs/ts-types": "^1.10.4",
|
"@injectivelabs/ts-types": "^1.10.12",
|
||||||
"@injectivelabs/utils": "^1.10.5",
|
"@injectivelabs/utils": "^1.10.12",
|
||||||
"@metamask/eth-sig-util": "^4.0.0",
|
"@metamask/eth-sig-util": "^4.0.0",
|
||||||
"axios": "^0.27.2",
|
"axios": "^0.27.2",
|
||||||
"bech32": "^2.0.0",
|
"bech32": "^2.0.0",
|
||||||
|
@ -2266,9 +2266,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@injectivelabs/test-utils": {
|
"node_modules/@injectivelabs/test-utils": {
|
||||||
"version": "1.10.2",
|
"version": "1.11.0",
|
||||||
"resolved": "https://registry.npmjs.org/@injectivelabs/test-utils/-/test-utils-1.10.2.tgz",
|
"resolved": "https://registry.npmjs.org/@injectivelabs/test-utils/-/test-utils-1.11.0.tgz",
|
||||||
"integrity": "sha512-B84qmz4ABxynSiNefUqGbR6ZQOciGJTUv7CSEYN9oRLNZoRCE+jsCVTh9SSqSKF4ZD84llAnyISYWweStW7ifw==",
|
"integrity": "sha512-/KIPGeLFsjITs43yQG++SoOtDExZr+Pa3JVYIZEIMFUVG8a7z9Vi5m6a1kbowvozZbLG5KHuuUXF2SdfKSxznQ==",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"axios": "^0.21.1",
|
"axios": "^0.21.1",
|
||||||
|
@ -2288,15 +2288,15 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@injectivelabs/token-metadata": {
|
"node_modules/@injectivelabs/token-metadata": {
|
||||||
"version": "1.10.25",
|
"version": "1.11.0",
|
||||||
"resolved": "https://registry.npmjs.org/@injectivelabs/token-metadata/-/token-metadata-1.10.25.tgz",
|
"resolved": "https://registry.npmjs.org/@injectivelabs/token-metadata/-/token-metadata-1.11.0.tgz",
|
||||||
"integrity": "sha512-irMqhjyovmlYwFquNCWcFfbk16T8cmXT+tnTQsi0G2+YXqUlJJF0dnELvLeYDNROwM2EEJEWvl/4V5DWHKLd7w==",
|
"integrity": "sha512-RzwJvnjDX8IwXYTvZDCMQcGxkN/0ZfXUEYTVMB0WMU0bRH7cV7WJ6Z9UDOijAehrJHu/fByDz2DuEOcktbwoIw==",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@injectivelabs/exceptions": "^1.10.5",
|
"@injectivelabs/exceptions": "^1.11.0",
|
||||||
"@injectivelabs/networks": "^1.10.7",
|
"@injectivelabs/networks": "^1.11.0",
|
||||||
"@injectivelabs/ts-types": "^1.10.4",
|
"@injectivelabs/ts-types": "^1.11.0",
|
||||||
"@injectivelabs/utils": "^1.10.5",
|
"@injectivelabs/utils": "^1.11.0",
|
||||||
"@types/lodash.values": "^4.3.6",
|
"@types/lodash.values": "^4.3.6",
|
||||||
"copyfiles": "^2.4.1",
|
"copyfiles": "^2.4.1",
|
||||||
"jsonschema": "^1.4.0",
|
"jsonschema": "^1.4.0",
|
||||||
|
@ -2306,10 +2306,48 @@
|
||||||
"shx": "^0.3.2"
|
"shx": "^0.3.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@injectivelabs/token-metadata/node_modules/@injectivelabs/networks": {
|
||||||
|
"version": "1.11.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@injectivelabs/networks/-/networks-1.11.0.tgz",
|
||||||
|
"integrity": "sha512-0dtO/zZ8AzsxGInEWZ7tpOA0Q++M3FhAFxOWzhYC39ZeJlwHhEcYmvmhrGG5gRdus29XfFysRlaz3hyT3XH1Jg==",
|
||||||
|
"hasInstallScript": true,
|
||||||
|
"dependencies": {
|
||||||
|
"@injectivelabs/exceptions": "^1.11.0",
|
||||||
|
"@injectivelabs/ts-types": "^1.11.0",
|
||||||
|
"@injectivelabs/utils": "^1.11.0",
|
||||||
|
"link-module-alias": "^1.2.0",
|
||||||
|
"shx": "^0.3.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@injectivelabs/token-metadata/node_modules/@injectivelabs/utils": {
|
||||||
|
"version": "1.11.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@injectivelabs/utils/-/utils-1.11.0.tgz",
|
||||||
|
"integrity": "sha512-KnUmt4vIvoBz6F3mQomy4GeTkpcHMYwju2AgiqzARrrqgF/2p1ZHfKBpr1ksj/jkl5X+irh3JVfbd/dFjwKi1g==",
|
||||||
|
"hasInstallScript": true,
|
||||||
|
"dependencies": {
|
||||||
|
"@injectivelabs/exceptions": "^1.11.0",
|
||||||
|
"@injectivelabs/ts-types": "^1.11.0",
|
||||||
|
"axios": "^0.21.1",
|
||||||
|
"bignumber.js": "^9.0.1",
|
||||||
|
"http-status-codes": "^2.2.0",
|
||||||
|
"link-module-alias": "^1.2.0",
|
||||||
|
"shx": "^0.3.2",
|
||||||
|
"snakecase-keys": "^5.1.2",
|
||||||
|
"store2": "^2.12.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@injectivelabs/token-metadata/node_modules/axios": {
|
||||||
|
"version": "0.21.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
|
||||||
|
"integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
|
||||||
|
"dependencies": {
|
||||||
|
"follow-redirects": "^1.14.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@injectivelabs/ts-types": {
|
"node_modules/@injectivelabs/ts-types": {
|
||||||
"version": "1.10.4",
|
"version": "1.11.0",
|
||||||
"resolved": "https://registry.npmjs.org/@injectivelabs/ts-types/-/ts-types-1.10.4.tgz",
|
"resolved": "https://registry.npmjs.org/@injectivelabs/ts-types/-/ts-types-1.11.0.tgz",
|
||||||
"integrity": "sha512-NvC1xEG/qiRF36mtwM4fr12kwg8UFduQBQ/MQsM8yp1QRH+Qtq/My1j0AGcOWpMZ0tVONhWvUvr+t7Yih7ciAg==",
|
"integrity": "sha512-3ZVRW1xMe3RHOxFblRC0LgQcU/rpxgZQZ+sISyRKFGcS/m2ApkdmcPvjMgd5TQe9AXW/6nnvmul3mST8iAaUJg==",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"link-module-alias": "^1.2.0",
|
"link-module-alias": "^1.2.0",
|
||||||
|
@ -2317,13 +2355,13 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@injectivelabs/utils": {
|
"node_modules/@injectivelabs/utils": {
|
||||||
"version": "1.10.5",
|
"version": "1.10.12",
|
||||||
"resolved": "https://registry.npmjs.org/@injectivelabs/utils/-/utils-1.10.5.tgz",
|
"resolved": "https://registry.npmjs.org/@injectivelabs/utils/-/utils-1.10.12.tgz",
|
||||||
"integrity": "sha512-9t+9xOh8wQWs/kuUrfWjGAJMVbtgwu20AWdDQl5qeoNxstE7uKTM0hJWCn+OhF5WYloZH7kwfqEUSNZ84G/VpA==",
|
"integrity": "sha512-c8al79nxIJgV1cBAdW2TPDGldj/8gm5k0h5TIN/AJs8/AeIjpTwwVGfLY3QvPOpRsxuQ9CjBkTXrAcSL1wwkcw==",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@injectivelabs/exceptions": "^1.10.5",
|
"@injectivelabs/exceptions": "^1.10.12",
|
||||||
"@injectivelabs/ts-types": "^1.10.4",
|
"@injectivelabs/ts-types": "^1.10.12",
|
||||||
"axios": "^0.21.1",
|
"axios": "^0.21.1",
|
||||||
"bignumber.js": "^9.0.1",
|
"bignumber.js": "^9.0.1",
|
||||||
"http-status-codes": "^2.2.0",
|
"http-status-codes": "^2.2.0",
|
||||||
|
@ -8453,16 +8491,16 @@
|
||||||
"requires": {}
|
"requires": {}
|
||||||
},
|
},
|
||||||
"@certusone/wormhole-sdk": {
|
"@certusone/wormhole-sdk": {
|
||||||
"version": "0.9.16",
|
"version": "0.9.18",
|
||||||
"resolved": "https://registry.npmjs.org/@certusone/wormhole-sdk/-/wormhole-sdk-0.9.16.tgz",
|
"resolved": "https://registry.npmjs.org/@certusone/wormhole-sdk/-/wormhole-sdk-0.9.18.tgz",
|
||||||
"integrity": "sha512-UFcGvMW6yku0Qz4hyFw0H4IKKlUJ2VHrHo0PnSUOfbBf7RfXHKPE9VxsVeCKILbhBzBmECVVP4xF7WlrBBn8/Q==",
|
"integrity": "sha512-0YtrdZmjfiUHL78Yr4FA59ywb+pIevbID/TJpJTp/EKWqm/v+9PS4YBMBEtjpDZR/PSqe6hB8MasF38fUjMGtQ==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"@certusone/wormhole-sdk-proto-web": "0.0.6",
|
"@certusone/wormhole-sdk-proto-web": "0.0.6",
|
||||||
"@certusone/wormhole-sdk-wasm": "^0.0.1",
|
"@certusone/wormhole-sdk-wasm": "^0.0.1",
|
||||||
"@coral-xyz/borsh": "0.2.6",
|
"@coral-xyz/borsh": "0.2.6",
|
||||||
"@injectivelabs/networks": "1.10.7",
|
"@injectivelabs/networks": "1.10.12",
|
||||||
"@injectivelabs/sdk-ts": "1.10.47",
|
"@injectivelabs/sdk-ts": "1.10.72",
|
||||||
"@injectivelabs/utils": "1.10.5",
|
"@injectivelabs/utils": "1.10.12",
|
||||||
"@mysten/sui.js": "0.32.2",
|
"@mysten/sui.js": "0.32.2",
|
||||||
"@project-serum/anchor": "^0.25.0",
|
"@project-serum/anchor": "^0.25.0",
|
||||||
"@solana/spl-token": "^0.3.5",
|
"@solana/spl-token": "^0.3.5",
|
||||||
|
@ -9326,9 +9364,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@injectivelabs/core-proto-ts": {
|
"@injectivelabs/core-proto-ts": {
|
||||||
"version": "0.0.12",
|
"version": "0.0.14",
|
||||||
"resolved": "https://registry.npmjs.org/@injectivelabs/core-proto-ts/-/core-proto-ts-0.0.12.tgz",
|
"resolved": "https://registry.npmjs.org/@injectivelabs/core-proto-ts/-/core-proto-ts-0.0.14.tgz",
|
||||||
"integrity": "sha512-axdL+KWuv4aORIdYqJQy5k9H+bPsi5Y4KWNcYPxrFQ0FAu+sjpvm5PmbIzBSgv/hnIB2cHcLuKvE3BtEa3vJ/w==",
|
"integrity": "sha512-NZWlgBzgVrXow9IknFQHvcYKX4QkUD25taRigoNYQK8PDn4+VXd9xM5WFUDRhzm2smTCguyl/+MghpEp4oTPWw==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"@injectivelabs/grpc-web": "^0.0.1",
|
"@injectivelabs/grpc-web": "^0.0.1",
|
||||||
"google-protobuf": "^3.14.0",
|
"google-protobuf": "^3.14.0",
|
||||||
|
@ -9363,12 +9401,12 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@injectivelabs/exceptions": {
|
"@injectivelabs/exceptions": {
|
||||||
"version": "1.10.5",
|
"version": "1.11.0",
|
||||||
"resolved": "https://registry.npmjs.org/@injectivelabs/exceptions/-/exceptions-1.10.5.tgz",
|
"resolved": "https://registry.npmjs.org/@injectivelabs/exceptions/-/exceptions-1.11.0.tgz",
|
||||||
"integrity": "sha512-jeAa5GL3dbe9vXykzu54RP2RETZ6m92XzOTFWb3F0UgB1GtGEDKoMYxN8CJn9RYz3buCPcHxMi/+og6FHu+RaQ==",
|
"integrity": "sha512-jZ0N4cP1KCyErNEiCARaKt70E8KMTNa9R4a5FrCERX4cFKPxdbWpoQ8Lqga2jfHAgiFcChRJ5JmaSYclFtKf9w==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"@injectivelabs/grpc-web": "^0.0.1",
|
"@injectivelabs/grpc-web": "^0.0.1",
|
||||||
"@injectivelabs/ts-types": "^1.10.4",
|
"@injectivelabs/ts-types": "^1.11.0",
|
||||||
"http-status-codes": "^2.2.0",
|
"http-status-codes": "^2.2.0",
|
||||||
"link-module-alias": "^1.2.0",
|
"link-module-alias": "^1.2.0",
|
||||||
"shx": "^0.3.2"
|
"shx": "^0.3.2"
|
||||||
|
@ -9432,9 +9470,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@injectivelabs/mito-proto-ts": {
|
"@injectivelabs/mito-proto-ts": {
|
||||||
"version": "1.0.4",
|
"version": "1.0.9",
|
||||||
"resolved": "https://registry.npmjs.org/@injectivelabs/mito-proto-ts/-/mito-proto-ts-1.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/@injectivelabs/mito-proto-ts/-/mito-proto-ts-1.0.9.tgz",
|
||||||
"integrity": "sha512-8raVmZnaXVbpikMTmnc+OtViBPzgyx2ilezUTZFCNcQzZM01lbJlpd0NbF6K5tG76eJ3Wjwj+YpAdRPNuayZ4A==",
|
"integrity": "sha512-+TZMvJ4SHwcn6SFPdqaiQFZdNhjH7hyRFozY15nOTC2utdGij9jEsjz1NsyOejfYDA0s1z5Wm1SgrMYKaVpAmQ==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"@injectivelabs/grpc-web": "^0.0.1",
|
"@injectivelabs/grpc-web": "^0.0.1",
|
||||||
"google-protobuf": "^3.14.0",
|
"google-protobuf": "^3.14.0",
|
||||||
|
@ -9469,39 +9507,39 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@injectivelabs/networks": {
|
"@injectivelabs/networks": {
|
||||||
"version": "1.10.7",
|
"version": "1.10.12",
|
||||||
"resolved": "https://registry.npmjs.org/@injectivelabs/networks/-/networks-1.10.7.tgz",
|
"resolved": "https://registry.npmjs.org/@injectivelabs/networks/-/networks-1.10.12.tgz",
|
||||||
"integrity": "sha512-qnU3A7FgTVi4bGEMaSsSIN2wTBhKZfV+3fiwU09aX8ZNcWAilMx8d/mlE1naZFAHs7Kf5hFBxzgeSRZa1GJqiA==",
|
"integrity": "sha512-tTHyLls1Nik5QTs/S03qqG2y/ITvNwI8CJOQbMmmsr1CL2CdjJBtzRYn9Dyx2p8XgzRFf9hmlybpe20tq9O3SA==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"@injectivelabs/exceptions": "^1.10.5",
|
"@injectivelabs/exceptions": "^1.10.12",
|
||||||
"@injectivelabs/ts-types": "^1.10.4",
|
"@injectivelabs/ts-types": "^1.10.12",
|
||||||
"@injectivelabs/utils": "^1.10.5",
|
"@injectivelabs/utils": "^1.10.12",
|
||||||
"link-module-alias": "^1.2.0",
|
"link-module-alias": "^1.2.0",
|
||||||
"shx": "^0.3.2"
|
"shx": "^0.3.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@injectivelabs/sdk-ts": {
|
"@injectivelabs/sdk-ts": {
|
||||||
"version": "1.10.47",
|
"version": "1.10.72",
|
||||||
"resolved": "https://registry.npmjs.org/@injectivelabs/sdk-ts/-/sdk-ts-1.10.47.tgz",
|
"resolved": "https://registry.npmjs.org/@injectivelabs/sdk-ts/-/sdk-ts-1.10.72.tgz",
|
||||||
"integrity": "sha512-G11Cdf5iO6is0qWzQRdfiUJLI8IPF4VtD5mVfBwnakrk78syN/Dy492trL7hispDSQaCJaP6a/fa6HnMPCsvzA==",
|
"integrity": "sha512-A5mHNNBgO4fI1c/7CZ0bGfVXliy8laP+VaYZ++aWh1YyudoZw4CTCEmLetZRy7AUU3XcfbHa8sAImRi7db+v6Q==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"@apollo/client": "^3.5.8",
|
"@apollo/client": "^3.5.8",
|
||||||
"@cosmjs/amino": "^0.30.1",
|
"@cosmjs/amino": "^0.30.1",
|
||||||
"@cosmjs/proto-signing": "^0.30.1",
|
"@cosmjs/proto-signing": "^0.30.1",
|
||||||
"@cosmjs/stargate": "^0.30.1",
|
"@cosmjs/stargate": "^0.30.1",
|
||||||
"@ethersproject/bytes": "^5.7.0",
|
"@ethersproject/bytes": "^5.7.0",
|
||||||
"@injectivelabs/core-proto-ts": "^0.0.12",
|
"@injectivelabs/core-proto-ts": "^0.0.14",
|
||||||
"@injectivelabs/exceptions": "^1.10.5",
|
"@injectivelabs/exceptions": "^1.10.12",
|
||||||
"@injectivelabs/grpc-web": "^0.0.1",
|
"@injectivelabs/grpc-web": "^0.0.1",
|
||||||
"@injectivelabs/grpc-web-node-http-transport": "^0.0.2",
|
"@injectivelabs/grpc-web-node-http-transport": "^0.0.2",
|
||||||
"@injectivelabs/grpc-web-react-native-transport": "^0.0.2",
|
"@injectivelabs/grpc-web-react-native-transport": "^0.0.2",
|
||||||
"@injectivelabs/indexer-proto-ts": "1.10.8-rc.4",
|
"@injectivelabs/indexer-proto-ts": "1.10.8-rc.4",
|
||||||
"@injectivelabs/mito-proto-ts": "1.0.4",
|
"@injectivelabs/mito-proto-ts": "1.0.9",
|
||||||
"@injectivelabs/networks": "^1.10.7",
|
"@injectivelabs/networks": "^1.10.12",
|
||||||
"@injectivelabs/test-utils": "^1.10.2",
|
"@injectivelabs/test-utils": "^1.10.12",
|
||||||
"@injectivelabs/token-metadata": "^1.10.25",
|
"@injectivelabs/token-metadata": "^1.10.42",
|
||||||
"@injectivelabs/ts-types": "^1.10.4",
|
"@injectivelabs/ts-types": "^1.10.12",
|
||||||
"@injectivelabs/utils": "^1.10.5",
|
"@injectivelabs/utils": "^1.10.12",
|
||||||
"@metamask/eth-sig-util": "^4.0.0",
|
"@metamask/eth-sig-util": "^4.0.0",
|
||||||
"axios": "^0.27.2",
|
"axios": "^0.27.2",
|
||||||
"bech32": "^2.0.0",
|
"bech32": "^2.0.0",
|
||||||
|
@ -9702,9 +9740,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@injectivelabs/test-utils": {
|
"@injectivelabs/test-utils": {
|
||||||
"version": "1.10.2",
|
"version": "1.11.0",
|
||||||
"resolved": "https://registry.npmjs.org/@injectivelabs/test-utils/-/test-utils-1.10.2.tgz",
|
"resolved": "https://registry.npmjs.org/@injectivelabs/test-utils/-/test-utils-1.11.0.tgz",
|
||||||
"integrity": "sha512-B84qmz4ABxynSiNefUqGbR6ZQOciGJTUv7CSEYN9oRLNZoRCE+jsCVTh9SSqSKF4ZD84llAnyISYWweStW7ifw==",
|
"integrity": "sha512-/KIPGeLFsjITs43yQG++SoOtDExZr+Pa3JVYIZEIMFUVG8a7z9Vi5m6a1kbowvozZbLG5KHuuUXF2SdfKSxznQ==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"axios": "^0.21.1",
|
"axios": "^0.21.1",
|
||||||
"bignumber.js": "^9.0.1",
|
"bignumber.js": "^9.0.1",
|
||||||
|
@ -9725,14 +9763,14 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@injectivelabs/token-metadata": {
|
"@injectivelabs/token-metadata": {
|
||||||
"version": "1.10.25",
|
"version": "1.11.0",
|
||||||
"resolved": "https://registry.npmjs.org/@injectivelabs/token-metadata/-/token-metadata-1.10.25.tgz",
|
"resolved": "https://registry.npmjs.org/@injectivelabs/token-metadata/-/token-metadata-1.11.0.tgz",
|
||||||
"integrity": "sha512-irMqhjyovmlYwFquNCWcFfbk16T8cmXT+tnTQsi0G2+YXqUlJJF0dnELvLeYDNROwM2EEJEWvl/4V5DWHKLd7w==",
|
"integrity": "sha512-RzwJvnjDX8IwXYTvZDCMQcGxkN/0ZfXUEYTVMB0WMU0bRH7cV7WJ6Z9UDOijAehrJHu/fByDz2DuEOcktbwoIw==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"@injectivelabs/exceptions": "^1.10.5",
|
"@injectivelabs/exceptions": "^1.11.0",
|
||||||
"@injectivelabs/networks": "^1.10.7",
|
"@injectivelabs/networks": "^1.11.0",
|
||||||
"@injectivelabs/ts-types": "^1.10.4",
|
"@injectivelabs/ts-types": "^1.11.0",
|
||||||
"@injectivelabs/utils": "^1.10.5",
|
"@injectivelabs/utils": "^1.11.0",
|
||||||
"@types/lodash.values": "^4.3.6",
|
"@types/lodash.values": "^4.3.6",
|
||||||
"copyfiles": "^2.4.1",
|
"copyfiles": "^2.4.1",
|
||||||
"jsonschema": "^1.4.0",
|
"jsonschema": "^1.4.0",
|
||||||
|
@ -9740,24 +9778,62 @@
|
||||||
"lodash": "^4.17.21",
|
"lodash": "^4.17.21",
|
||||||
"lodash.values": "^4.3.0",
|
"lodash.values": "^4.3.0",
|
||||||
"shx": "^0.3.2"
|
"shx": "^0.3.2"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@injectivelabs/networks": {
|
||||||
|
"version": "1.11.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@injectivelabs/networks/-/networks-1.11.0.tgz",
|
||||||
|
"integrity": "sha512-0dtO/zZ8AzsxGInEWZ7tpOA0Q++M3FhAFxOWzhYC39ZeJlwHhEcYmvmhrGG5gRdus29XfFysRlaz3hyT3XH1Jg==",
|
||||||
|
"requires": {
|
||||||
|
"@injectivelabs/exceptions": "^1.11.0",
|
||||||
|
"@injectivelabs/ts-types": "^1.11.0",
|
||||||
|
"@injectivelabs/utils": "^1.11.0",
|
||||||
|
"link-module-alias": "^1.2.0",
|
||||||
|
"shx": "^0.3.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"@injectivelabs/utils": {
|
||||||
|
"version": "1.11.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@injectivelabs/utils/-/utils-1.11.0.tgz",
|
||||||
|
"integrity": "sha512-KnUmt4vIvoBz6F3mQomy4GeTkpcHMYwju2AgiqzARrrqgF/2p1ZHfKBpr1ksj/jkl5X+irh3JVfbd/dFjwKi1g==",
|
||||||
|
"requires": {
|
||||||
|
"@injectivelabs/exceptions": "^1.11.0",
|
||||||
|
"@injectivelabs/ts-types": "^1.11.0",
|
||||||
|
"axios": "^0.21.1",
|
||||||
|
"bignumber.js": "^9.0.1",
|
||||||
|
"http-status-codes": "^2.2.0",
|
||||||
|
"link-module-alias": "^1.2.0",
|
||||||
|
"shx": "^0.3.2",
|
||||||
|
"snakecase-keys": "^5.1.2",
|
||||||
|
"store2": "^2.12.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"axios": {
|
||||||
|
"version": "0.21.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
|
||||||
|
"integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
|
||||||
|
"requires": {
|
||||||
|
"follow-redirects": "^1.14.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@injectivelabs/ts-types": {
|
"@injectivelabs/ts-types": {
|
||||||
"version": "1.10.4",
|
"version": "1.11.0",
|
||||||
"resolved": "https://registry.npmjs.org/@injectivelabs/ts-types/-/ts-types-1.10.4.tgz",
|
"resolved": "https://registry.npmjs.org/@injectivelabs/ts-types/-/ts-types-1.11.0.tgz",
|
||||||
"integrity": "sha512-NvC1xEG/qiRF36mtwM4fr12kwg8UFduQBQ/MQsM8yp1QRH+Qtq/My1j0AGcOWpMZ0tVONhWvUvr+t7Yih7ciAg==",
|
"integrity": "sha512-3ZVRW1xMe3RHOxFblRC0LgQcU/rpxgZQZ+sISyRKFGcS/m2ApkdmcPvjMgd5TQe9AXW/6nnvmul3mST8iAaUJg==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"link-module-alias": "^1.2.0",
|
"link-module-alias": "^1.2.0",
|
||||||
"shx": "^0.3.2"
|
"shx": "^0.3.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@injectivelabs/utils": {
|
"@injectivelabs/utils": {
|
||||||
"version": "1.10.5",
|
"version": "1.10.12",
|
||||||
"resolved": "https://registry.npmjs.org/@injectivelabs/utils/-/utils-1.10.5.tgz",
|
"resolved": "https://registry.npmjs.org/@injectivelabs/utils/-/utils-1.10.12.tgz",
|
||||||
"integrity": "sha512-9t+9xOh8wQWs/kuUrfWjGAJMVbtgwu20AWdDQl5qeoNxstE7uKTM0hJWCn+OhF5WYloZH7kwfqEUSNZ84G/VpA==",
|
"integrity": "sha512-c8al79nxIJgV1cBAdW2TPDGldj/8gm5k0h5TIN/AJs8/AeIjpTwwVGfLY3QvPOpRsxuQ9CjBkTXrAcSL1wwkcw==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"@injectivelabs/exceptions": "^1.10.5",
|
"@injectivelabs/exceptions": "^1.10.12",
|
||||||
"@injectivelabs/ts-types": "^1.10.4",
|
"@injectivelabs/ts-types": "^1.10.12",
|
||||||
"axios": "^0.21.1",
|
"axios": "^0.21.1",
|
||||||
"bignumber.js": "^9.0.1",
|
"bignumber.js": "^9.0.1",
|
||||||
"http-status-codes": "^2.2.0",
|
"http-status-codes": "^2.2.0",
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@celo-tools/celo-ethers-wrapper": "^0.1.0",
|
"@celo-tools/celo-ethers-wrapper": "^0.1.0",
|
||||||
"@certusone/wormhole-sdk": "^0.9.16",
|
"@certusone/wormhole-sdk": "^0.9.18",
|
||||||
"@cosmjs/encoding": "^0.26.2",
|
"@cosmjs/encoding": "^0.26.2",
|
||||||
"@injectivelabs/networks": "^1.10.7",
|
"@injectivelabs/networks": "^1.10.7",
|
||||||
"@injectivelabs/sdk-ts": "^1.10.47",
|
"@injectivelabs/sdk-ts": "^1.10.47",
|
||||||
|
|
|
@ -9,6 +9,8 @@ import { sha3_256 } from "js-sha3";
|
||||||
import { NETWORKS } from "./consts";
|
import { NETWORKS } from "./consts";
|
||||||
import { Network } from "./utils";
|
import { Network } from "./utils";
|
||||||
import { Payload, impossible } from "./vaa";
|
import { Payload, impossible } from "./vaa";
|
||||||
|
import { CHAINS, ensureHexPrefix } from "@certusone/wormhole-sdk";
|
||||||
|
import { TokenBridgeState } from "@certusone/wormhole-sdk/lib/esm/aptos/types";
|
||||||
|
|
||||||
export async function execute_aptos(
|
export async function execute_aptos(
|
||||||
payload: Payload,
|
payload: Payload,
|
||||||
|
@ -335,3 +337,65 @@ function hex(x: string): Buffer {
|
||||||
"hex"
|
"hex"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function queryRegistrationsAptos(
|
||||||
|
network: Network,
|
||||||
|
module: "Core" | "NFTBridge" | "TokenBridge"
|
||||||
|
): Promise<Object> {
|
||||||
|
const n = NETWORKS[network]["aptos"];
|
||||||
|
const client = new AptosClient(n.rpc);
|
||||||
|
const contracts = CONTRACTS[network]["aptos"];
|
||||||
|
let stateObjectId: string | undefined;
|
||||||
|
|
||||||
|
switch (module) {
|
||||||
|
case "TokenBridge":
|
||||||
|
stateObjectId = contracts.token_bridge;
|
||||||
|
if (stateObjectId === undefined) {
|
||||||
|
throw Error(`Unknown token bridge contract on ${network} for Aptos`);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new Error(`Invalid module: ${module}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
stateObjectId = ensureHexPrefix(stateObjectId);
|
||||||
|
const state = (
|
||||||
|
await client.getAccountResource(
|
||||||
|
stateObjectId,
|
||||||
|
`${stateObjectId}::state::State`
|
||||||
|
)
|
||||||
|
).data as TokenBridgeState;
|
||||||
|
|
||||||
|
const handle = state.registered_emitters.handle;
|
||||||
|
|
||||||
|
// Query the bridge registration for all the chains in parallel.
|
||||||
|
const registrations: string[][] = await Promise.all(
|
||||||
|
Object.entries(CHAINS)
|
||||||
|
.filter(([cname, _]) => cname !== "aptos" && cname !== "unset")
|
||||||
|
.map(async ([cname, cid]) => [
|
||||||
|
cname,
|
||||||
|
await (async () => {
|
||||||
|
let result = null;
|
||||||
|
try {
|
||||||
|
result = await client.getTableItem(handle, {
|
||||||
|
key_type: "u64",
|
||||||
|
value_type: "vector<u8>",
|
||||||
|
key: cid.toString(),
|
||||||
|
});
|
||||||
|
} catch {
|
||||||
|
// Not logging anything because a chain not registered returns an error.
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
})(),
|
||||||
|
])
|
||||||
|
);
|
||||||
|
|
||||||
|
const results: { [key: string]: string } = {};
|
||||||
|
for (let [cname, queryResponse] of registrations) {
|
||||||
|
if (queryResponse) {
|
||||||
|
results[cname] = queryResponse;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,79 @@
|
||||||
|
import { getCosmWasmClient } from "@sei-js/core";
|
||||||
|
import {
|
||||||
|
ChainName,
|
||||||
|
CHAINS,
|
||||||
|
CONTRACTS,
|
||||||
|
} from "@certusone/wormhole-sdk/lib/esm/utils/consts";
|
||||||
|
import { NETWORKS } from "../../consts/networks";
|
||||||
|
import { Network } from "../../utils";
|
||||||
|
|
||||||
|
export async function queryRegistrationsSei(
|
||||||
|
network: Network,
|
||||||
|
module: "Core" | "NFTBridge" | "TokenBridge"
|
||||||
|
): Promise<Object> {
|
||||||
|
const chain = "sei" as ChainName;
|
||||||
|
const n = NETWORKS[network][chain];
|
||||||
|
const contracts = CONTRACTS[network][chain];
|
||||||
|
|
||||||
|
let target_contract: string | undefined;
|
||||||
|
|
||||||
|
switch (module) {
|
||||||
|
case "TokenBridge":
|
||||||
|
target_contract = contracts.token_bridge;
|
||||||
|
break;
|
||||||
|
case "NFTBridge":
|
||||||
|
target_contract = contracts.nft_bridge;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new Error(`Invalid module: ${module}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!target_contract) {
|
||||||
|
throw new Error(`Contract for ${module} on ${network} does not exist`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (n.rpc === undefined) {
|
||||||
|
throw new Error(`RPC for ${module} on ${network} does not exist`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a CosmWasmClient
|
||||||
|
const client = await getCosmWasmClient(n.rpc);
|
||||||
|
|
||||||
|
// Query the bridge registration for all the chains in parallel.
|
||||||
|
const registrations = await Promise.all(
|
||||||
|
Object.entries(CHAINS)
|
||||||
|
.filter(([c_name, _]) => c_name !== chain && c_name !== "unset")
|
||||||
|
.map(async ([c_name, c_id]) => [
|
||||||
|
c_name,
|
||||||
|
await (async () => {
|
||||||
|
let query_msg = {
|
||||||
|
chain_registration: {
|
||||||
|
chain: c_id,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
let result = null;
|
||||||
|
try {
|
||||||
|
result = await client.queryContractSmart(
|
||||||
|
target_contract as string,
|
||||||
|
query_msg
|
||||||
|
);
|
||||||
|
} catch {
|
||||||
|
// Not logging anything because a chain not registered returns an error.
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
})(),
|
||||||
|
])
|
||||||
|
);
|
||||||
|
|
||||||
|
const results: { [key: string]: string } = {};
|
||||||
|
for (let [c_name, queryResponse] of registrations) {
|
||||||
|
if (queryResponse) {
|
||||||
|
results[c_name] = Buffer.from(queryResponse.address, "base64").toString(
|
||||||
|
"hex"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return results;
|
||||||
|
}
|
|
@ -0,0 +1,57 @@
|
||||||
|
import { getObjectFields } from "@certusone/wormhole-sdk/lib/esm/sui";
|
||||||
|
import {
|
||||||
|
CHAIN_ID_TO_NAME,
|
||||||
|
CONTRACTS,
|
||||||
|
} from "@certusone/wormhole-sdk/lib/esm/utils/consts";
|
||||||
|
import { NETWORKS } from "../../consts/networks";
|
||||||
|
import { Network } from "../../utils";
|
||||||
|
import { getProvider } from "./utils";
|
||||||
|
import { ChainId } from "@certusone/wormhole-sdk";
|
||||||
|
|
||||||
|
export async function queryRegistrationsSui(
|
||||||
|
network: Network,
|
||||||
|
module: "Core" | "NFTBridge" | "TokenBridge"
|
||||||
|
): Promise<Object> {
|
||||||
|
const n = NETWORKS[network]["sui"];
|
||||||
|
const provider = getProvider(network, n.rpc);
|
||||||
|
const contracts = CONTRACTS[network]["sui"];
|
||||||
|
let state_object_id: string;
|
||||||
|
|
||||||
|
switch (module) {
|
||||||
|
case "TokenBridge":
|
||||||
|
state_object_id = contracts.token_bridge;
|
||||||
|
if (state_object_id === undefined) {
|
||||||
|
throw Error(`Unknown token bridge contract on ${network} for Sui`);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new Error(`Invalid module: ${module}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const state = await getObjectFields(provider, state_object_id);
|
||||||
|
const emitterRegistryId = state!.emitter_registry.fields.id.id;
|
||||||
|
|
||||||
|
// TODO: handle pagination
|
||||||
|
// - recursive: https://github.com/wormhole-foundation/wormhole/blob/7608b2b740df5d4c2551daaf4d620eac81c07790/sdk/js/src/sui/utils.ts#L175
|
||||||
|
// - iterative: https://github.com/wormhole-foundation/wormhole/blob/7608b2b740df5d4c2551daaf4d620eac81c07790/sdk/js/src/sui/utils.ts#L199
|
||||||
|
const emitterRegistry = await provider.getDynamicFields({
|
||||||
|
parentId: emitterRegistryId,
|
||||||
|
});
|
||||||
|
|
||||||
|
const results: { [key: string]: string } = {};
|
||||||
|
for (let idx = 0; idx < emitterRegistry.data.length; idx++) {
|
||||||
|
const chainId = emitterRegistry.data[idx].name.value as ChainId;
|
||||||
|
for (const { objectId } of emitterRegistry.data.slice(idx, idx + 1)) {
|
||||||
|
const emitter = (await provider.getObject({
|
||||||
|
id: objectId,
|
||||||
|
options: { showContent: true },
|
||||||
|
})) as any;
|
||||||
|
const emitterAddress: Uint8Array =
|
||||||
|
emitter.data?.content?.fields.value.fields.value.fields.data;
|
||||||
|
const emitterAddrStr = Buffer.from(emitterAddress).toString("hex");
|
||||||
|
results[CHAIN_ID_TO_NAME[chainId]] = emitterAddrStr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return results;
|
||||||
|
}
|
|
@ -3,6 +3,7 @@ import * as chainId from "./chainId";
|
||||||
import * as contract from "./contract";
|
import * as contract from "./contract";
|
||||||
import * as emitter from "./emitter";
|
import * as emitter from "./emitter";
|
||||||
import * as origin from "./origin";
|
import * as origin from "./origin";
|
||||||
|
import * as registrations from "./registrations";
|
||||||
import * as rpc from "./rpc";
|
import * as rpc from "./rpc";
|
||||||
import * as wrapped from "./wrapped";
|
import * as wrapped from "./wrapped";
|
||||||
|
|
||||||
|
@ -15,6 +16,7 @@ export const builder = (y: typeof yargs) =>
|
||||||
.command(contract)
|
.command(contract)
|
||||||
.command(emitter)
|
.command(emitter)
|
||||||
.command(origin)
|
.command(origin)
|
||||||
|
.command(registrations)
|
||||||
.command(rpc)
|
.command(rpc)
|
||||||
.command(wrapped);
|
.command(wrapped);
|
||||||
export const handler = () => {};
|
export const handler = () => {};
|
||||||
|
|
|
@ -0,0 +1,164 @@
|
||||||
|
// The registration command queries the TokenBridge or NFTBridge for all bridges registered with it. By default,
|
||||||
|
// it prints out the results. Optionally, you can specify --verify to have it verify the registrations against what
|
||||||
|
// is defined in the consts.ts file in the SDK (to verify that all chains // are properly registered.)
|
||||||
|
|
||||||
|
import yargs from "yargs";
|
||||||
|
import {
|
||||||
|
assertChain,
|
||||||
|
ChainName,
|
||||||
|
CHAINS,
|
||||||
|
Contracts,
|
||||||
|
CONTRACTS,
|
||||||
|
isEVMChain,
|
||||||
|
isTerraChain,
|
||||||
|
} from "@certusone/wormhole-sdk/lib/esm/utils/consts";
|
||||||
|
import { getEmitterAddress } from "../../emitter";
|
||||||
|
|
||||||
|
export const command = "registrations <network> <chain> <module>";
|
||||||
|
export const desc = "Print chain registrations";
|
||||||
|
export const builder = (y: typeof yargs) => {
|
||||||
|
return y
|
||||||
|
.positional("network", {
|
||||||
|
describe: "network",
|
||||||
|
choices: ["mainnet", "testnet", "devnet"],
|
||||||
|
demandOption: true,
|
||||||
|
} as const)
|
||||||
|
.positional("chain", {
|
||||||
|
describe: "Chain to query",
|
||||||
|
choices: Object.keys(CHAINS) as ChainName[],
|
||||||
|
demandOption: true,
|
||||||
|
} as const)
|
||||||
|
.positional("module", {
|
||||||
|
describe: "Module to query (TokenBridge or NFTBridge)",
|
||||||
|
type: "string",
|
||||||
|
choices: ["NFTBridge", "TokenBridge"],
|
||||||
|
demandOption: true,
|
||||||
|
})
|
||||||
|
.option("verify", {
|
||||||
|
alias: "v",
|
||||||
|
describe: "Verify the results against the const file",
|
||||||
|
type: "boolean",
|
||||||
|
default: false,
|
||||||
|
demandOption: false,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
export const handler = async (
|
||||||
|
argv: Awaited<ReturnType<typeof builder>["argv"]>
|
||||||
|
) => {
|
||||||
|
assertChain(argv.chain);
|
||||||
|
const chain = argv.chain;
|
||||||
|
const network = argv.network.toUpperCase();
|
||||||
|
if (network !== "MAINNET" && network !== "TESTNET" && network !== "DEVNET") {
|
||||||
|
throw Error(`Unknown network: ${network}`);
|
||||||
|
}
|
||||||
|
const module = argv.module;
|
||||||
|
if (module !== "TokenBridge" && module !== "NFTBridge") {
|
||||||
|
throw Error(`Module must be TokenBridge or NFTBridge`);
|
||||||
|
}
|
||||||
|
let results: object;
|
||||||
|
if (chain === "solana") {
|
||||||
|
const solana = require("../../solana");
|
||||||
|
results = await solana.queryRegistrationsSolana(network, module);
|
||||||
|
} else if (isEVMChain(chain)) {
|
||||||
|
const evm = require("../../evm");
|
||||||
|
results = await evm.queryRegistrationsEvm(network, chain, module);
|
||||||
|
} else if (isTerraChain(chain) || chain === "xpla") {
|
||||||
|
const terra = require("../../terra");
|
||||||
|
results = await terra.queryRegistrationsTerra(network, chain, module);
|
||||||
|
} else if (chain === "injective") {
|
||||||
|
const injective = require("../../injective");
|
||||||
|
results = await injective.queryRegistrationsInjective(network, module);
|
||||||
|
} else if (chain === "sei") {
|
||||||
|
const sei = require("../../chains/sei/registrations");
|
||||||
|
results = await sei.queryRegistrationsSei(network, module);
|
||||||
|
} else if (chain === "sui") {
|
||||||
|
const sui = require("../../chains/sui/registrations");
|
||||||
|
results = await sui.queryRegistrationsSui(network, module);
|
||||||
|
} else if (chain === "aptos") {
|
||||||
|
const aptos = require("../../aptos");
|
||||||
|
results = await aptos.queryRegistrationsAptos(network, module);
|
||||||
|
} else {
|
||||||
|
throw Error(`Command not supported for chain ${chain}`);
|
||||||
|
}
|
||||||
|
if (argv["verify"]) {
|
||||||
|
verifyRegistrations(network, chain as string, module, results);
|
||||||
|
} else {
|
||||||
|
console.log(results);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// verifyRegistrations takes the results returned above and verifies them against the expected values in the consts file.
|
||||||
|
async function verifyRegistrations(
|
||||||
|
network: "MAINNET" | "TESTNET" | "DEVNET",
|
||||||
|
chain: string,
|
||||||
|
module: "NFTBridge" | "TokenBridge",
|
||||||
|
input: Object
|
||||||
|
) {
|
||||||
|
let mismatchFound = false;
|
||||||
|
|
||||||
|
// Put the input in a map so we can do lookups.
|
||||||
|
let inputMap = new Map<string, string>();
|
||||||
|
for (const [cname, reg] of Object.entries(input)) {
|
||||||
|
inputMap.set(cname as string, reg as string);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Loop over the chains and make sure everything is in our input, and the values match.
|
||||||
|
const results: { [key: string]: string } = {};
|
||||||
|
for (const chainStr in CHAINS) {
|
||||||
|
const thisChain = chainStr as ChainName;
|
||||||
|
if (thisChain === "unset" || thisChain === chain) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const contracts: Contracts = CONTRACTS[network][thisChain];
|
||||||
|
|
||||||
|
let expectedAddr: string | undefined;
|
||||||
|
if (module === "TokenBridge") {
|
||||||
|
expectedAddr = contracts.token_bridge;
|
||||||
|
} else {
|
||||||
|
expectedAddr = contracts.nft_bridge;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (expectedAddr !== undefined) {
|
||||||
|
expectedAddr = await getEmitterAddress(
|
||||||
|
thisChain as ChainName,
|
||||||
|
expectedAddr
|
||||||
|
);
|
||||||
|
if (!expectedAddr.startsWith("0x")) {
|
||||||
|
expectedAddr = "0x" + expectedAddr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let actualAddr = inputMap.get(thisChain as string);
|
||||||
|
if (actualAddr !== undefined && !actualAddr.startsWith("0x")) {
|
||||||
|
actualAddr = "0x" + actualAddr;
|
||||||
|
}
|
||||||
|
if (expectedAddr !== undefined) {
|
||||||
|
if (
|
||||||
|
actualAddr === undefined ||
|
||||||
|
actualAddr ===
|
||||||
|
"0x0000000000000000000000000000000000000000000000000000000000000000"
|
||||||
|
) {
|
||||||
|
results[thisChain] = "Missing " + expectedAddr;
|
||||||
|
mismatchFound = true;
|
||||||
|
} else if (actualAddr !== expectedAddr) {
|
||||||
|
results[thisChain] =
|
||||||
|
"Expected " + expectedAddr + ", found " + actualAddr;
|
||||||
|
mismatchFound = true;
|
||||||
|
}
|
||||||
|
} else if (
|
||||||
|
actualAddr !== undefined &&
|
||||||
|
actualAddr !==
|
||||||
|
"0x0000000000000000000000000000000000000000000000000000000000000000"
|
||||||
|
) {
|
||||||
|
results[thisChain] = "Expected null , found " + actualAddr;
|
||||||
|
mismatchFound = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mismatchFound) {
|
||||||
|
console.log(`Mismatches found on ${chain} ${network}!`);
|
||||||
|
console.log(results);
|
||||||
|
} else {
|
||||||
|
console.log(`Verification of ${chain} ${network} succeeded!`);
|
||||||
|
}
|
||||||
|
}
|
|
@ -135,13 +135,13 @@ export const handler = async (
|
||||||
};
|
};
|
||||||
|
|
||||||
async function executeSubmit(
|
async function executeSubmit(
|
||||||
vaa_hex: string,
|
vaaHex: string,
|
||||||
parsed_vaa: VAA<Payload>,
|
parsedVaa: VAA<Payload>,
|
||||||
buf: Buffer,
|
buf: Buffer,
|
||||||
network: Network,
|
network: Network,
|
||||||
chain: ChainName,
|
chain: ChainName,
|
||||||
rpc: string | undefined,
|
rpc: string | undefined,
|
||||||
contract_address: string | undefined
|
contractAddress: string | undefined
|
||||||
) {
|
) {
|
||||||
if (chain === "unset") {
|
if (chain === "unset") {
|
||||||
throw Error(
|
throw Error(
|
||||||
|
@ -149,43 +149,37 @@ async function executeSubmit(
|
||||||
);
|
);
|
||||||
} else if (isEVMChain(chain)) {
|
} else if (isEVMChain(chain)) {
|
||||||
await execute_evm(
|
await execute_evm(
|
||||||
parsed_vaa.payload,
|
parsedVaa.payload,
|
||||||
buf,
|
buf,
|
||||||
network,
|
network,
|
||||||
chain,
|
chain,
|
||||||
contract_address,
|
contractAddress,
|
||||||
rpc
|
rpc
|
||||||
);
|
);
|
||||||
} else if (isTerraChain(chain)) {
|
} else if (isTerraChain(chain)) {
|
||||||
await execute_terra(parsed_vaa.payload, buf, network, chain);
|
await execute_terra(parsedVaa.payload, buf, network, chain);
|
||||||
} else if (chain === "solana" || chain === "pythnet") {
|
} else if (chain === "solana" || chain === "pythnet") {
|
||||||
await execute_solana(parsed_vaa, buf, network, chain);
|
await execute_solana(parsedVaa, buf, network, chain);
|
||||||
} else if (chain === "algorand") {
|
} else if (chain === "algorand") {
|
||||||
await execute_algorand(
|
await execute_algorand(
|
||||||
parsed_vaa.payload,
|
parsedVaa.payload,
|
||||||
new Uint8Array(Buffer.from(vaa_hex, "hex")),
|
new Uint8Array(Buffer.from(vaaHex, "hex")),
|
||||||
network
|
network
|
||||||
);
|
);
|
||||||
} else if (chain === "near") {
|
} else if (chain === "near") {
|
||||||
await execute_near(parsed_vaa.payload, vaa_hex, network);
|
await execute_near(parsedVaa.payload, vaaHex, network);
|
||||||
} else if (chain === "injective") {
|
} else if (chain === "injective") {
|
||||||
await execute_injective(parsed_vaa.payload, buf, network);
|
await execute_injective(parsedVaa.payload, buf, network);
|
||||||
} else if (chain === "xpla") {
|
} else if (chain === "xpla") {
|
||||||
await execute_xpla(parsed_vaa.payload, buf, network);
|
await execute_xpla(parsedVaa.payload, buf, network);
|
||||||
} else if (chain === "sei") {
|
} else if (chain === "sei") {
|
||||||
await submitSei(parsed_vaa.payload, buf, network);
|
await submitSei(parsedVaa.payload, buf, network);
|
||||||
} else if (chain === "osmosis") {
|
} else if (chain === "osmosis") {
|
||||||
throw Error("OSMOSIS is not supported yet");
|
throw Error("OSMOSIS is not supported yet");
|
||||||
} else if (chain === "sui") {
|
} else if (chain === "sui") {
|
||||||
await submitSui(parsed_vaa.payload, buf, network, rpc);
|
await submitSui(parsedVaa.payload, buf, network, rpc);
|
||||||
} else if (chain === "aptos") {
|
} else if (chain === "aptos") {
|
||||||
await execute_aptos(
|
await execute_aptos(parsedVaa.payload, buf, network, contractAddress, rpc);
|
||||||
parsed_vaa.payload,
|
|
||||||
buf,
|
|
||||||
network,
|
|
||||||
contract_address,
|
|
||||||
rpc
|
|
||||||
);
|
|
||||||
} else if (chain === "wormchain") {
|
} else if (chain === "wormchain") {
|
||||||
throw Error("Wormchain is not supported yet");
|
throw Error("Wormchain is not supported yet");
|
||||||
} else if (chain === "btc") {
|
} else if (chain === "btc") {
|
||||||
|
@ -198,19 +192,19 @@ async function executeSubmit(
|
||||||
}
|
}
|
||||||
|
|
||||||
async function submitToAll(
|
async function submitToAll(
|
||||||
vaa_hex: string,
|
vaaHex: string,
|
||||||
parsed_vaa: VAA<Payload>,
|
parsedVaa: VAA<Payload>,
|
||||||
buf: Buffer,
|
buf: Buffer,
|
||||||
network: Network
|
network: Network
|
||||||
) {
|
) {
|
||||||
let skip_chain: ChainName = "unset";
|
let skip_chain: ChainName = "unset";
|
||||||
if (parsed_vaa.payload.type === "RegisterChain") {
|
if (parsedVaa.payload.type === "RegisterChain") {
|
||||||
skip_chain = toChainName(parsed_vaa.payload.emitterChain as ChainId);
|
skip_chain = toChainName(parsedVaa.payload.emitterChain as ChainId);
|
||||||
} else if (parsed_vaa.payload.type === "AttestMeta") {
|
} else if (parsedVaa.payload.type === "AttestMeta") {
|
||||||
skip_chain = toChainName(parsed_vaa.payload.tokenChain as ChainId);
|
skip_chain = toChainName(parsedVaa.payload.tokenChain as ChainId);
|
||||||
} else {
|
} else {
|
||||||
throw Error(
|
throw Error(
|
||||||
`Invalid VAA payload type (${parsed_vaa.payload.type}), only "RegisterChain" and "AttestMeta" are supported with --all-chains`
|
`Invalid VAA payload type (${parsedVaa.payload.type}), only "RegisterChain" and "AttestMeta" are supported with --all-chains`
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -236,9 +230,8 @@ async function submitToAll(
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (
|
if (
|
||||||
(parsed_vaa.payload.module === "TokenBridge" &&
|
(parsedVaa.payload.module === "TokenBridge" && !contracts.token_bridge) ||
|
||||||
!contracts.token_bridge) ||
|
(parsedVaa.payload.module === "NFTBridge" && !contracts.nft_bridge)
|
||||||
(parsed_vaa.payload.module === "NFTBridge" && !contracts.nft_bridge)
|
|
||||||
) {
|
) {
|
||||||
console.log(`Skipping ${chain} because the contract is not defined`);
|
console.log(`Skipping ${chain} because the contract is not defined`);
|
||||||
continue;
|
continue;
|
||||||
|
@ -247,8 +240,8 @@ async function submitToAll(
|
||||||
console.log(`Submitting VAA to ${chain} ${network}`);
|
console.log(`Submitting VAA to ${chain} ${network}`);
|
||||||
try {
|
try {
|
||||||
await executeSubmit(
|
await executeSubmit(
|
||||||
vaa_hex,
|
vaaHex,
|
||||||
parsed_vaa,
|
parsedVaa,
|
||||||
buf,
|
buf,
|
||||||
network,
|
network,
|
||||||
chain,
|
chain,
|
||||||
|
|
|
@ -52,11 +52,11 @@ export async function getEmitterAddress(
|
||||||
addr = "ccceeb29348f71bdd22ffef43a2a19c1f5b5e17c5cca5411529120182672ade5";
|
addr = "ccceeb29348f71bdd22ffef43a2a19c1f5b5e17c5cca5411529120182672ade5";
|
||||||
} else if (
|
} else if (
|
||||||
addr ===
|
addr ===
|
||||||
"0x32422cb2f929b6a4e3f81b4791ea11ac2af896b310f3d9442aa1fe924ce0bab4"
|
"0x6fb10cdb7aa299e9a4308752dadecb049ff55a892de92992a1edbd7912b3d6da"
|
||||||
) {
|
) {
|
||||||
// Testnet TokenBridge
|
// Testnet TokenBridge
|
||||||
addr =
|
addr =
|
||||||
"0xb22cd218bb63da447ac2704c1cc72727df6b5e981ee17a22176fd7b84c114610";
|
"0x40440411a170b4842ae7dee4f4a7b7a58bc0a98566e998850a7bb87bf5dc05b9";
|
||||||
} else {
|
} else {
|
||||||
throw Error(`Unsupported Sui address: ${addr}`);
|
throw Error(`Unsupported Sui address: ${addr}`);
|
||||||
}
|
}
|
||||||
|
|
|
@ -721,3 +721,54 @@ const maybeUnsupported = async <T>(
|
||||||
|
|
||||||
const isUnsupportedError = (e: any): e is { reason: string } =>
|
const isUnsupportedError = (e: any): e is { reason: string } =>
|
||||||
e && typeof e === "object" && "reason" in e && e.reason === "unsupported";
|
e && typeof e === "object" && "reason" in e && e.reason === "unsupported";
|
||||||
|
|
||||||
|
export async function queryRegistrationsEvm(
|
||||||
|
network: Network,
|
||||||
|
chain: EVMChainName,
|
||||||
|
module: "Core" | "NFTBridge" | "TokenBridge"
|
||||||
|
): Promise<Object> {
|
||||||
|
const n = NETWORKS[network][chain];
|
||||||
|
const contracts = CONTRACTS[network][chain];
|
||||||
|
|
||||||
|
let targetContract: string | undefined;
|
||||||
|
let contract: any;
|
||||||
|
|
||||||
|
const provider = new ethers.providers.JsonRpcProvider(n.rpc);
|
||||||
|
|
||||||
|
switch (module) {
|
||||||
|
case "TokenBridge":
|
||||||
|
targetContract = contracts.token_bridge;
|
||||||
|
if (targetContract === undefined) {
|
||||||
|
throw Error(`Unknown token bridge contract on ${network} for ${chain}`);
|
||||||
|
}
|
||||||
|
contract = BridgeImplementation__factory.connect(
|
||||||
|
targetContract,
|
||||||
|
provider
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case "NFTBridge":
|
||||||
|
targetContract = contracts.nft_bridge;
|
||||||
|
if (targetContract === undefined) {
|
||||||
|
throw Error(`Unknown NFT bridge contract on ${network} for ${chain}`);
|
||||||
|
}
|
||||||
|
contract = NFTBridgeImplementation__factory.connect(
|
||||||
|
targetContract,
|
||||||
|
provider
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new Error(`Invalid module: ${module}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const registrations: string[][] = await Promise.all(
|
||||||
|
Object.entries(CHAINS)
|
||||||
|
.filter(([cname, _]) => cname !== chain && cname !== "unset")
|
||||||
|
.map(async ([cname, cid]) => [cname, await contract.bridgeContracts(cid)])
|
||||||
|
);
|
||||||
|
|
||||||
|
const results: { [key: string]: string } = {};
|
||||||
|
for (let [cname, c] of registrations) {
|
||||||
|
results[cname] = c;
|
||||||
|
}
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
|
@ -1,9 +1,13 @@
|
||||||
import { CONTRACTS } from "@certusone/wormhole-sdk/lib/esm/utils/consts";
|
import {
|
||||||
|
CHAINS,
|
||||||
|
CONTRACTS,
|
||||||
|
} from "@certusone/wormhole-sdk/lib/esm/utils/consts";
|
||||||
import {
|
import {
|
||||||
getNetworkInfo,
|
getNetworkInfo,
|
||||||
Network as InjectiveNetwork,
|
Network as InjectiveNetwork,
|
||||||
} from "@injectivelabs/networks";
|
} from "@injectivelabs/networks";
|
||||||
import {
|
import {
|
||||||
|
ChainGrpcWasmApi,
|
||||||
ChainRestAuthApi,
|
ChainRestAuthApi,
|
||||||
createTransaction,
|
createTransaction,
|
||||||
MsgExecuteContractCompat,
|
MsgExecuteContractCompat,
|
||||||
|
@ -203,3 +207,73 @@ export async function execute_injective(
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function queryRegistrationsInjective(
|
||||||
|
network: Network,
|
||||||
|
module: "Core" | "NFTBridge" | "TokenBridge"
|
||||||
|
) {
|
||||||
|
const chain = "injective";
|
||||||
|
const n = NETWORKS[network][chain];
|
||||||
|
const contracts = CONTRACTS[network][chain];
|
||||||
|
|
||||||
|
let targetContract: string | undefined;
|
||||||
|
|
||||||
|
switch (module) {
|
||||||
|
case "TokenBridge":
|
||||||
|
targetContract = contracts.token_bridge;
|
||||||
|
break;
|
||||||
|
case "NFTBridge":
|
||||||
|
targetContract = contracts.nft_bridge;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new Error(`Invalid module: ${module}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (targetContract === undefined) {
|
||||||
|
throw new Error(`Contract for ${module} on ${network} does not exist`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (n === undefined || n.rpc === undefined) {
|
||||||
|
throw new Error(`RPC for ${module} on ${network} does not exist`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const client = new ChainGrpcWasmApi(n.rpc);
|
||||||
|
|
||||||
|
// Query the bridge registration for all the chains in parallel.
|
||||||
|
const registrations: (any | null)[][] = await Promise.all(
|
||||||
|
Object.entries(CHAINS)
|
||||||
|
.filter(([cname, _]) => cname !== chain && cname !== "unset")
|
||||||
|
.map(async ([cname, cid]) => [
|
||||||
|
cname,
|
||||||
|
await (async () => {
|
||||||
|
let query_msg = {
|
||||||
|
chain_registration: {
|
||||||
|
chain: cid,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
let result = null;
|
||||||
|
try {
|
||||||
|
result = await client.fetchSmartContractState(
|
||||||
|
targetContract as string,
|
||||||
|
Buffer.from(JSON.stringify(query_msg)).toString("base64")
|
||||||
|
);
|
||||||
|
} catch {
|
||||||
|
// Not logging anything because a chain not registered returns an error.
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
})(),
|
||||||
|
])
|
||||||
|
);
|
||||||
|
|
||||||
|
const results: { [key: string]: string } = {};
|
||||||
|
for (let [cname, queryResponse] of registrations) {
|
||||||
|
if (queryResponse) {
|
||||||
|
results[cname] = Buffer.from(queryResponse.address, "base64").toString(
|
||||||
|
"hex"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(results);
|
||||||
|
}
|
||||||
|
|
|
@ -9,6 +9,8 @@ import {
|
||||||
createCreateWrappedInstruction,
|
createCreateWrappedInstruction,
|
||||||
createRegisterChainInstruction as createTokenBridgeRegisterChainInstruction,
|
createRegisterChainInstruction as createTokenBridgeRegisterChainInstruction,
|
||||||
createUpgradeContractInstruction as createTokenBridgeUpgradeContractInstruction,
|
createUpgradeContractInstruction as createTokenBridgeUpgradeContractInstruction,
|
||||||
|
deriveEndpointKey,
|
||||||
|
getEndpointRegistration,
|
||||||
} from "@certusone/wormhole-sdk/lib/esm/solana/tokenBridge";
|
} from "@certusone/wormhole-sdk/lib/esm/solana/tokenBridge";
|
||||||
import {
|
import {
|
||||||
createUpgradeGuardianSetInstruction,
|
createUpgradeGuardianSetInstruction,
|
||||||
|
@ -23,6 +25,9 @@ import * as web3s from "@solana/web3.js";
|
||||||
import base58 from "bs58";
|
import base58 from "bs58";
|
||||||
import { NETWORKS } from "./consts";
|
import { NETWORKS } from "./consts";
|
||||||
import { Payload, VAA, impossible } from "./vaa";
|
import { Payload, VAA, impossible } from "./vaa";
|
||||||
|
import { ChainName, hexToUint8Array } from "@certusone/wormhole-sdk";
|
||||||
|
import { getEmitterAddress } from "./emitter";
|
||||||
|
import { Network } from "./utils";
|
||||||
|
|
||||||
export async function execute_solana(
|
export async function execute_solana(
|
||||||
v: VAA<Payload>,
|
v: VAA<Payload>,
|
||||||
|
@ -212,3 +217,86 @@ export async function execute_solana(
|
||||||
|
|
||||||
const setupConnection = (rpc: string): web3s.Connection =>
|
const setupConnection = (rpc: string): web3s.Connection =>
|
||||||
new web3s.Connection(rpc, "confirmed");
|
new web3s.Connection(rpc, "confirmed");
|
||||||
|
|
||||||
|
// queryRegistrationsSolana queries the bridge contract for chain registrations.
|
||||||
|
// Solana does not support querying to see "What address is chain X registered for?" Instead
|
||||||
|
// we have to ask "Is chain X registered with address Y?" Therefore, we loop through all of the
|
||||||
|
// chains and query to see if the latest address defined in the const file is registered.
|
||||||
|
export async function queryRegistrationsSolana(
|
||||||
|
network: Network,
|
||||||
|
module: "Core" | "NFTBridge" | "TokenBridge"
|
||||||
|
): Promise<Object> {
|
||||||
|
const chain = "solana" as ChainName;
|
||||||
|
const n = NETWORKS[network][chain];
|
||||||
|
const contracts = CONTRACTS[network][chain];
|
||||||
|
|
||||||
|
let targetAddress: string | undefined;
|
||||||
|
|
||||||
|
switch (module) {
|
||||||
|
case "TokenBridge":
|
||||||
|
targetAddress = contracts.token_bridge;
|
||||||
|
break;
|
||||||
|
case "NFTBridge":
|
||||||
|
targetAddress = contracts.nft_bridge;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new Error(`Invalid module: ${module}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!targetAddress) {
|
||||||
|
throw new Error(`Contract for ${module} on ${network} does not exist`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (n === undefined || n.rpc === undefined) {
|
||||||
|
throw new Error(`RPC for ${module} on ${network} does not exist`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const connection = setupConnection(n.rpc);
|
||||||
|
const programId = new web3s.PublicKey(targetAddress);
|
||||||
|
|
||||||
|
// Query the bridge registration for all the chains in parallel.
|
||||||
|
const registrations: (string | null)[][] = await Promise.all(
|
||||||
|
Object.entries(CHAINS)
|
||||||
|
.filter(([cname, _]) => cname !== chain && cname !== "unset")
|
||||||
|
.map(async ([cstr, cid]) => [
|
||||||
|
cstr,
|
||||||
|
await (async () => {
|
||||||
|
let cname = cstr as ChainName;
|
||||||
|
let addr: string | undefined;
|
||||||
|
if (module === "TokenBridge") {
|
||||||
|
addr = CONTRACTS[network][cname].token_bridge;
|
||||||
|
} else {
|
||||||
|
addr = CONTRACTS[network][cname].nft_bridge;
|
||||||
|
}
|
||||||
|
if (addr === undefined) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
let emitter_addr = await getEmitterAddress(cname as ChainName, addr);
|
||||||
|
|
||||||
|
const endpoint = deriveEndpointKey(
|
||||||
|
programId,
|
||||||
|
cid,
|
||||||
|
hexToUint8Array(emitter_addr)
|
||||||
|
);
|
||||||
|
|
||||||
|
let result: string | null = null;
|
||||||
|
try {
|
||||||
|
await getEndpointRegistration(connection, endpoint);
|
||||||
|
result = emitter_addr;
|
||||||
|
} catch {
|
||||||
|
// Not logging anything because a chain not registered returns an error.
|
||||||
|
}
|
||||||
|
|
||||||
|
return result as string;
|
||||||
|
})(),
|
||||||
|
])
|
||||||
|
);
|
||||||
|
|
||||||
|
const results: { [key: string]: string } = {};
|
||||||
|
for (let [cname, queryResponse] of registrations) {
|
||||||
|
if (cname && queryResponse) {
|
||||||
|
results[cname] = queryResponse;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import {
|
import {
|
||||||
|
CHAINS,
|
||||||
CONTRACTS,
|
CONTRACTS,
|
||||||
TerraChainName,
|
TerraChainName,
|
||||||
} from "@certusone/wormhole-sdk/lib/esm/utils/consts";
|
} from "@certusone/wormhole-sdk/lib/esm/utils/consts";
|
||||||
|
@ -183,3 +184,82 @@ export async function execute_terra(
|
||||||
console.log(`TX hash: ${result.txhash}`);
|
console.log(`TX hash: ${result.txhash}`);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function queryRegistrationsTerra(
|
||||||
|
network: Network,
|
||||||
|
chain: TerraChainName,
|
||||||
|
module: "Core" | "NFTBridge" | "TokenBridge"
|
||||||
|
): Promise<Object> {
|
||||||
|
const n = NETWORKS[network][chain];
|
||||||
|
const contracts = CONTRACTS[network][chain];
|
||||||
|
|
||||||
|
let targetContract: string | undefined;
|
||||||
|
|
||||||
|
switch (module) {
|
||||||
|
case "TokenBridge":
|
||||||
|
targetContract = contracts.token_bridge;
|
||||||
|
break;
|
||||||
|
case "NFTBridge":
|
||||||
|
targetContract = contracts.nft_bridge;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new Error(`Invalid module: ${module}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (targetContract === undefined) {
|
||||||
|
throw new Error(`Contract for ${module} on ${network} does not exist`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (n === undefined || n.rpc === undefined) {
|
||||||
|
throw new Error(`RPC for ${module} on ${network} does not exist`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (n === undefined || n.chain_id === undefined) {
|
||||||
|
throw new Error(`Chain id for ${module} on ${network} does not exist`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const client = new LCDClient({
|
||||||
|
URL: n.rpc,
|
||||||
|
chainID: n.chain_id,
|
||||||
|
isClassic: chain === "terra",
|
||||||
|
});
|
||||||
|
|
||||||
|
// Query the bridge registration for all the chains in parallel.
|
||||||
|
const registrations: (string | null)[][] = await Promise.all(
|
||||||
|
Object.entries(CHAINS)
|
||||||
|
.filter(([cname, _]) => cname !== chain && cname !== "unset")
|
||||||
|
.map(async ([cname, cid]) => [
|
||||||
|
cname,
|
||||||
|
await (async () => {
|
||||||
|
let query_msg = {
|
||||||
|
chain_registration: {
|
||||||
|
chain: cid,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
let result = null;
|
||||||
|
try {
|
||||||
|
const resp: { address: string } = await client.wasm.contractQuery(
|
||||||
|
targetContract as string,
|
||||||
|
query_msg
|
||||||
|
);
|
||||||
|
if (resp) {
|
||||||
|
result = resp.address;
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
// Not logging anything because a chain not registered returns an error.
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
})(),
|
||||||
|
])
|
||||||
|
);
|
||||||
|
|
||||||
|
const results: { [key: string]: string } = {};
|
||||||
|
for (let [cname, queryResponse] of registrations) {
|
||||||
|
if (cname && queryResponse) {
|
||||||
|
results[cname] = Buffer.from(queryResponse, "base64").toString("hex");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue