diff --git a/packages/cosmos-ts/CHANGELOG.md b/packages/cosmos-ts/CHANGELOG.md index 6c7c0ebd2..f41217b52 100644 --- a/packages/cosmos-ts/CHANGELOG.md +++ b/packages/cosmos-ts/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.0.28](https://github.com/InjectiveLabs/injective-ts/compare/@injectivelabs/cosmos-ts@0.0.27...@injectivelabs/cosmos-ts@0.0.28) (2021-12-07) + + +### Features + +* terra wallet ([092f87e](https://github.com/InjectiveLabs/injective-ts/commit/092f87e26187bebe07b63ac9dcdadb29e874b294)) + + + + + ## [0.0.27](https://github.com/InjectiveLabs/injective-ts/compare/@injectivelabs/cosmos-ts@0.0.26...@injectivelabs/cosmos-ts@0.0.27) (2021-12-05) diff --git a/packages/cosmos-ts/package.json b/packages/cosmos-ts/package.json index bebbd2e86..f7997d041 100644 --- a/packages/cosmos-ts/package.json +++ b/packages/cosmos-ts/package.json @@ -1,7 +1,7 @@ { "name": "@injectivelabs/cosmos-ts", "description": "Cosmos related wrappers.", - "version": "0.0.27", + "version": "0.0.28", "license": "MIT", "main": "dist/index.js", "types": "dist/index.d.ts", @@ -40,6 +40,7 @@ "@keplr-wallet/cosmos": "^0.9.7", "@keplr-wallet/types": "^0.9.6", "@keplr-wallet/unit": "^0.9.6", + "@terra-money/terra.js": "^3.0.1", "commitizen": "^4.2.4", "cosmjs-types": "^0.3.0", "link-module-alias": "^1.2.0", diff --git a/packages/cosmos-ts/src/CosmJsWallet.ts b/packages/cosmos-ts/src/Keplr/CosmJsWallet.ts similarity index 100% rename from packages/cosmos-ts/src/CosmJsWallet.ts rename to packages/cosmos-ts/src/Keplr/CosmJsWallet.ts diff --git a/packages/cosmos-ts/src/KeplrWallet.ts b/packages/cosmos-ts/src/Keplr/KeplrWallet.ts similarity index 100% rename from packages/cosmos-ts/src/KeplrWallet.ts rename to packages/cosmos-ts/src/Keplr/KeplrWallet.ts diff --git a/packages/cosmos-ts/src/chain/chains.ts b/packages/cosmos-ts/src/Keplr/chain/chains.ts similarity index 100% rename from packages/cosmos-ts/src/chain/chains.ts rename to packages/cosmos-ts/src/Keplr/chain/chains.ts diff --git a/packages/cosmos-ts/src/chain/index.ts b/packages/cosmos-ts/src/Keplr/chain/index.ts similarity index 100% rename from packages/cosmos-ts/src/chain/index.ts rename to packages/cosmos-ts/src/Keplr/chain/index.ts diff --git a/packages/cosmos-ts/src/endpoints.ts b/packages/cosmos-ts/src/Keplr/endpoints.ts similarity index 100% rename from packages/cosmos-ts/src/endpoints.ts rename to packages/cosmos-ts/src/Keplr/endpoints.ts diff --git a/packages/cosmos-ts/src/keplr.d.ts b/packages/cosmos-ts/src/Keplr/keplr.d.ts similarity index 100% rename from packages/cosmos-ts/src/keplr.d.ts rename to packages/cosmos-ts/src/Keplr/keplr.d.ts diff --git a/packages/cosmos-ts/src/types.ts b/packages/cosmos-ts/src/Keplr/types.ts similarity index 100% rename from packages/cosmos-ts/src/types.ts rename to packages/cosmos-ts/src/Keplr/types.ts diff --git a/packages/cosmos-ts/src/Terra/TerraJsWallet.ts b/packages/cosmos-ts/src/Terra/TerraJsWallet.ts new file mode 100644 index 000000000..f5890607f --- /dev/null +++ b/packages/cosmos-ts/src/Terra/TerraJsWallet.ts @@ -0,0 +1,126 @@ +import { + Extension, + Wallet, + Dec, + MsgTransfer, + Coin, + LCDClient, +} from '@terra-money/terra.js' +import { Height } from '@terra-money/terra.js/dist/core/ibc/msgs/client/Height' + +export class TerraJsWallet { + private extension: Extension + + private lcdClient: LCDClient + + constructor({ + restEndpoint, + chainId, + }: { + restEndpoint: string + chainId: string + }) { + this.extension = new Extension() + this.lcdClient = new LCDClient({ + URL: restEndpoint, + chainID: chainId, + }) + } + + static isTerraExtensionAvailable(): boolean { + return window.isTerraExtensionAvailable + } + + async connect(): Promise { + await this.extension.request('connect') + + return new Promise((resolve) => { + this.extension.on('connect', (w: Wallet) => { + resolve(w) + }) + }) + } + + async connectWithRequest(): Promise { + const response = await this.extension.request('connect') + + return (response.payload as { address: string }).address + } + + async fetchBalances({ + address, + denom, + }: { + address: string + denom?: string + }): Promise<{ denom: string; amount: string }[]> { + const [coins] = await this.lcdClient.bank.balance(address) + const balances = coins.toArray() + + if (balances.length === 0) { + return [] + } + + if (denom) { + const balance = balances.find( + (balance) => balance.denom.toLowerCase() === denom.toLowerCase(), + ) + + if (!balance) { + throw new Error(`No balance found for ${denom}`) + } + + return [{ denom: balance.denom, amount: balance.amount.toString() }] + } + + return balances.map((balance) => ({ + denom: balance.denom, + amount: balance.amount.toString(), + })) + } + + async sendIbcTokens({ + senderAddress, + recipientAddress, + transferAmount, + sourcePort, + sourceChannel, + timeoutHeight, + timeoutTimestamp, + }: { + senderAddress: string + recipientAddress: string + transferAmount: any + sourcePort: string + sourceChannel: string + timeoutHeight: any + timeoutTimestamp: number + }) { + const amount = new Dec(transferAmount.amount) + const coin = new Coin(transferAmount.denom, amount) + const height = new Height( + timeoutHeight?.revision_height, + timeoutHeight?.revision_height, + ) + const msgTransfer = new MsgTransfer( + sourcePort, + sourceChannel, + coin, + senderAddress, + recipientAddress, + height, + timeoutTimestamp, + ) + + try { + const response = await this.extension.request('post', { + msgs: [msgTransfer.toJSON()], + purgeQueue: true, + }) + + return response.payload + } catch (e: any) { + throw new Error(e.message) + } + } +} diff --git a/packages/cosmos-ts/src/Terra/endpoints.ts b/packages/cosmos-ts/src/Terra/endpoints.ts new file mode 100644 index 000000000..ecce50262 --- /dev/null +++ b/packages/cosmos-ts/src/Terra/endpoints.ts @@ -0,0 +1,8 @@ +import { TerraChainId } from './types' + +export const TerraEndpoints = { + [TerraChainId.Mainnet]: { + rpc: 'https://tm.terra.injective.network', + rest: 'https://lcd.terra.injective.network', + }, +} as Record diff --git a/packages/cosmos-ts/src/Terra/tokensMeta.ts b/packages/cosmos-ts/src/Terra/tokensMeta.ts new file mode 100644 index 000000000..27987dc78 --- /dev/null +++ b/packages/cosmos-ts/src/Terra/tokensMeta.ts @@ -0,0 +1,19 @@ +import { Erc20TokenMeta, TokenMeta } from '@injectivelabs/token-metadata' +import { TerraChainId } from './types' + +export interface TokenMetaWithDenom extends TokenMeta { + denom: string +} + +export const TerraTokensMeta = { + [TerraChainId.Mainnet]: [ + { + ...Erc20TokenMeta.getMetaBySymbol('LUNA'), + denom: 'uluna', + }, + { + ...Erc20TokenMeta.getMetaBySymbol('UST'), + denom: 'uusd', + }, + ], +} as Record diff --git a/packages/cosmos-ts/src/Terra/types.ts b/packages/cosmos-ts/src/Terra/types.ts new file mode 100644 index 000000000..439c87a92 --- /dev/null +++ b/packages/cosmos-ts/src/Terra/types.ts @@ -0,0 +1,3 @@ +export enum TerraChainId { + Mainnet = 'columbus-5', +} diff --git a/packages/cosmos-ts/src/index.ts b/packages/cosmos-ts/src/index.ts index 9d5ae1a84..10b49b211 100644 --- a/packages/cosmos-ts/src/index.ts +++ b/packages/cosmos-ts/src/index.ts @@ -1,4 +1,8 @@ -export * from './KeplrWallet' -export * from './CosmJsWallet' -export * from './types' -export * from './endpoints' +export * from './Keplr/KeplrWallet' +export * from './Keplr/CosmJsWallet' +export * from './Keplr/types' +export * from './Keplr/endpoints' +export * from './Terra/TerraJsWallet' +export * from './Terra/tokensMeta' +export * from './Terra/types' +export * from './Terra/endpoints' diff --git a/yarn.lock b/yarn.lock index 7818897af..23951bbe4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2993,6 +2993,34 @@ dependencies: defer-to-connect "^1.0.1" +"@terra-money/terra.js@^3.0.1": + version "3.0.1" + resolved "https://registry.npmjs.org/@terra-money/terra.js/-/terra.js-3.0.1.tgz#5f1db735273717828232d9a6476637f44d428bf4" + integrity sha512-bzWHGc70mCw3P9phattEnP/+Dhtf+49iw2bBZdagwovoGS/nzFlY+ESwLu3vQglHM9CDPQYaWtn3giytaAileQ== + dependencies: + "@terra-money/terra.proto" "^0.1.7" + axios "^0.24.0" + bech32 "^2.0.0" + bip32 "^2.0.6" + bip39 "^3.0.3" + bufferutil "^4.0.3" + decimal.js "^10.2.1" + jscrypto "^1.0.1" + readable-stream "^3.6.0" + secp256k1 "^4.0.2" + tmp "^0.2.1" + utf-8-validate "^5.0.5" + ws "^7.5.5" + +"@terra-money/terra.proto@^0.1.7": + version "0.1.7" + resolved "https://registry.npmjs.org/@terra-money/terra.proto/-/terra.proto-0.1.7.tgz#59c18f30da10d43200bab3ba8feb5b17e43a365f" + integrity sha512-NXD7f6pQCulvo6+mv6MAPzhOkUzRjgYVuHZE/apih+lVnPG5hDBU0rRYnOGGofwvKT5/jQoOENnFn/gioWWnyQ== + dependencies: + google-protobuf "^3.17.3" + long "^4.0.0" + protobufjs "~6.11.2" + "@tootallnate/once@1": version "1.1.2" resolved "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" @@ -3915,6 +3943,13 @@ axios@^0.23.0: dependencies: follow-redirects "^1.14.4" +axios@^0.24.0: + version "0.24.0" + resolved "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz#804e6fa1e4b9c5288501dd9dff56a7a0940d20d6" + integrity sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA== + dependencies: + follow-redirects "^1.14.4" + babel-jest@^27.2.0: version "27.2.0" resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-27.2.0.tgz#c0f129a81f1197028aeb4447acbc04564c8bfc52" @@ -4393,6 +4428,13 @@ bufferutil@^4.0.1: dependencies: node-gyp-build "^4.2.0" +bufferutil@^4.0.3: + version "4.0.5" + resolved "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.5.tgz#da9ea8166911cc276bf677b8aed2d02d31f59028" + integrity sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A== + dependencies: + node-gyp-build "^4.3.0" + builtins@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" @@ -7425,6 +7467,11 @@ google-protobuf@^3.14.0: resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.15.8.tgz#5f3948905e4951c867d6bc143f385a80e2a39efe" integrity sha512-2jtfdqTaSxk0cuBJBtTTWsot4WtR9RVr2rXg7x7OoqiuOKopPrwXpM1G4dXIkLcUNRh3RKzz76C8IOkksZSeOw== +google-protobuf@^3.17.3: + version "3.19.1" + resolved "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.19.1.tgz#5af5390e8206c446d8f49febaffd4b7f4ac28f41" + integrity sha512-Isv1RlNC+IzZzilcxnlVSf+JvuhxmY7DaxYCBy+zPS9XVuJRtlTTIXR9hnZ1YL1MMusJn/7eSy2swCzZIomQSg== + got@9.6.0: version "9.6.0" resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" @@ -8970,6 +9017,11 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= +jscrypto@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/jscrypto/-/jscrypto-1.0.2.tgz#2775430a39589693efb31d41421b103200c87dae" + integrity sha512-r+oNJLGTv1nkNMBBq3c70xYrFDgJOYVgs2OHijz5Ht+0KJ0yObD0oYxC9mN72KLzVfXw+osspg6t27IZvuTUxw== + jsdom@^16.6.0: version "16.7.0" resolved "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" @@ -10258,6 +10310,11 @@ node-gyp-build@^4.2.0: resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.3.tgz#ce6277f853835f718829efb47db20f3e4d9c4739" integrity sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg== +node-gyp-build@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3" + integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q== + node-gyp@^5.0.2: version "5.1.1" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-5.1.1.tgz#eb915f7b631c937d282e33aed44cb7a025f62a3e" @@ -12847,6 +12904,13 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" +tmp@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + tmpl@1.0.x: version "1.0.5" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" @@ -13371,6 +13435,13 @@ utf-8-validate@^5.0.2: dependencies: node-gyp-build "^4.2.0" +utf-8-validate@^5.0.5: + version "5.0.7" + resolved "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.7.tgz#c15a19a6af1f7ad9ec7ddc425747ca28c3644922" + integrity sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q== + dependencies: + node-gyp-build "^4.3.0" + utf8@3.0.0, utf8@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" @@ -14497,6 +14568,11 @@ ws@^7.4.0: resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.3.tgz#1f9643de34a543b8edb124bdcbc457ae55a6e5cd" integrity sha512-hr6vCR76GsossIRsr8OLR9acVVm1jyfEWvhbNjtgPOrfvAlKzvyeg/P6r8RuDjRyrcQoPQT7K0DGEPc7Ae6jzA== +ws@^7.5.5: + version "7.5.6" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz#e59fc509fb15ddfb65487ee9765c5a51dec5fe7b" + integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA== + xhr-request-promise@^0.1.2: version "0.1.3" resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz#2d5f4b16d8c6c893be97f1a62b0ed4cf3ca5f96c"