Skip to content

Commit

Permalink
feat: terra wallet
Browse files Browse the repository at this point in the history
  • Loading branch information
bangjelkoski committed Dec 7, 2021
1 parent 2881761 commit 7403790
Show file tree
Hide file tree
Showing 15 changed files with 253 additions and 5 deletions.
11 changes: 11 additions & 0 deletions packages/cosmos-ts/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)


Expand Down
3 changes: 2 additions & 1 deletion packages/cosmos-ts/package.json
Original file line number Diff line number Diff line change
@@ -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",
Expand Down Expand Up @@ -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",
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
126 changes: 126 additions & 0 deletions packages/cosmos-ts/src/Terra/TerraJsWallet.ts
Original file line number Diff line number Diff line change
@@ -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<Wallet> {
await this.extension.request('connect')

return new Promise((resolve) => {
this.extension.on('connect', (w: Wallet) => {
resolve(w)
})
})
}

async connectWithRequest(): Promise<string> {
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)
}
}
}
8 changes: 8 additions & 0 deletions packages/cosmos-ts/src/Terra/endpoints.ts
Original file line number Diff line number Diff line change
@@ -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<TerraChainId, { rpc: string; rest: string }>
19 changes: 19 additions & 0 deletions packages/cosmos-ts/src/Terra/tokensMeta.ts
Original file line number Diff line number Diff line change
@@ -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<TerraChainId, TokenMetaWithDenom[]>
3 changes: 3 additions & 0 deletions packages/cosmos-ts/src/Terra/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export enum TerraChainId {
Mainnet = 'columbus-5',
}
12 changes: 8 additions & 4 deletions packages/cosmos-ts/src/index.ts
Original file line number Diff line number Diff line change
@@ -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'
76 changes: 76 additions & 0 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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"
Expand Down Expand Up @@ -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"
Expand Down Expand Up @@ -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"
Expand Down Expand Up @@ -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"
Expand Down Expand Up @@ -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"
Expand Down Expand Up @@ -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"
Expand Down Expand Up @@ -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"
Expand Down Expand Up @@ -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"
Expand Down

0 comments on commit 7403790

Please sign in to comment.