Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Xchain wallet #954

Merged
merged 16 commits into from
Jan 5, 2024
5 changes: 5 additions & 0 deletions .changeset/rotten-ducks-admire.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@xchainjs/xchain-wallet': minor
---

XChain wallet package first release
5 changes: 5 additions & 0 deletions .changeset/six-foxes-sip.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@xchainjs/xchain-mayachain-amm': major
---

Wallet from XChainJS wallet package
18 changes: 16 additions & 2 deletions examples/do-maya-swap/do-maya-swap.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
import { Client as BtcClient, defaultBTCParams as defaultBtcParams } from '@xchainjs/xchain-bitcoin'
import { Network } from '@xchainjs/xchain-client'
import { MayachainAMM, Wallet } from '@xchainjs/xchain-mayachain-amm'
import { Client as DashClient, defaultDashParams } from '@xchainjs/xchain-dash'
import { Client as EthClient, defaultEthParams } from '@xchainjs/xchain-ethereum'
import { Client as KujiraClient, defaultKujiParams } from '@xchainjs/xchain-kujira'
import { Client as MayaClient } from '@xchainjs/xchain-mayachain'
import { MayachainAMM } from '@xchainjs/xchain-mayachain-amm'
import { MayaChain, MayachainQuery, QuoteSwap, QuoteSwapParams } from '@xchainjs/xchain-mayachain-query'
import { Client as ThorClient } from '@xchainjs/xchain-thorchain'
import { CryptoAmount, assetAmount, assetFromString, assetToBase, assetToString } from '@xchainjs/xchain-util'
import { Wallet } from '@xchainjs/xchain-wallet'

const printQuoteSwap = (quoteSwap: QuoteSwap) => {
console.log({
Expand Down Expand Up @@ -76,7 +83,14 @@ const main = async () => {
affiliateBps = Number(process.argv[9])
}

const wallet = new Wallet(seed, network)
const wallet = new Wallet({
BTC: new BtcClient({ ...defaultBtcParams, network, phrase: seed }),
ETH: new EthClient({ ...defaultEthParams, network, phrase: seed }),
DASH: new DashClient({ ...defaultDashParams, network, phrase: seed }),
KUJI: new KujiraClient({ ...defaultKujiParams, network, phrase: seed }),
THOR: new ThorClient({ network, phrase: seed }),
MAYA: new MayaClient({ network, phrase: seed }),
})
const toChain = toAsset.synth ? MayaChain : toAsset.chain
const quoteSwapParams: QuoteSwapParams = {
fromAsset,
Expand Down
1 change: 1 addition & 0 deletions examples/do-maya-swap/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
"@xchainjs/xchain-mayamidgard-query": "file:../../packages/xchain-mayamidgard-query",
"@xchainjs/xchain-mayachain-query": "file:../../packages/xchain-mayachain-query",
"@xchainjs/xchain-mayachain-amm": "file:../../packages/xchain-mayachain-amm",
"@xchainjs/xchain-wallet": "file:../../packages/xchain-wallet",
"axios-retry": "^3.3.1",
"bech32-buffer": "^0.2.0",
"bitcoinjs-lib": "5.2.0",
Expand Down
565 changes: 519 additions & 46 deletions examples/do-maya-swap/yarn.lock

Large diffs are not rendered by default.

3 changes: 1 addition & 2 deletions examples/wallet/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,12 @@
"@xchainjs/xchain-ethereum": "file:../../packages/xchain-ethereum",
"@xchainjs/xchain-kujira": "file:../../packages/xchain-kujira",
"@xchainjs/xchain-mayachain": "file:../../packages/xchain-mayachain",
"@xchainjs/xchain-mayachain-amm": "file:../../packages/xchain-mayachain-amm",
"@xchainjs/xchain-mayachain-query": "file:../../packages/xchain-mayachain-query",
"@xchainjs/xchain-mayamidgard": "file:../../packages/xchain-mayamidgard",
"@xchainjs/xchain-mayamidgard-query": "file:../../packages/xchain-mayamidgard-query",
"@xchainjs/xchain-mayanode": "file:../../packages/xchain-mayanode",
"@xchainjs/xchain-thorchain": "file:../../packages/xchain-thorchain",
"@xchainjs/xchain-util": "file:../../packages/xchain-util",
"@xchainjs/xchain-wallet": "file:../../packages/xchain-wallet",
"axios": "^1.3.6",
"axios-retry": "^3.3.1",
"bech32-buffer": "^0.2.0",
Expand Down
19 changes: 16 additions & 3 deletions examples/wallet/wallet.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
import cosmosclient from '@cosmos-client/core'
import { Client as BtcClient, defaultBTCParams as defaultBtcParams } from '@xchainjs/xchain-bitcoin'
import { Network } from '@xchainjs/xchain-client'
import { Wallet } from '@xchainjs/xchain-mayachain-amm'
import { Client as DashClient, defaultDashParams } from '@xchainjs/xchain-dash'
import { Client as EthClient, defaultEthParams } from '@xchainjs/xchain-ethereum'
import { Client as KujiraClient, defaultKujiParams } from '@xchainjs/xchain-kujira'
import { Client as MayaClient } from '@xchainjs/xchain-mayachain'
import { Client as ThorClient } from '@xchainjs/xchain-thorchain'
import {
Asset,
AssetAmount,
Expand All @@ -13,6 +18,7 @@ import {
delay,
register9Rheader,
} from '@xchainjs/xchain-util'
import { Wallet } from '@xchainjs/xchain-wallet'
import axios from 'axios'

register9Rheader(cosmosclient.config.globalAxios)
Expand Down Expand Up @@ -57,7 +63,7 @@ const _getAddress = async (wallet: Wallet, chain: Chain) => {

const _getHistories = async (wallet: Wallet, chains?: Chain[]) => {
const histories = await wallet.getTransactionsHistories(chains)
Object.keys((chain) => {
Object.keys(histories).forEach((chain) => {
const history = histories[chain]
console.log({
numTxs: history.total,
Expand Down Expand Up @@ -155,7 +161,14 @@ const _transfer = async (wallet: Wallet, asset: Asset, recipient: string, amount

const main = async () => {
const seed = process.argv[2]
const wallet: Wallet = new Wallet(seed, Network.Mainnet)
const wallet = new Wallet({
BTC: new BtcClient({ ...defaultBtcParams, network: Network.Mainnet, phrase: seed }),
ETH: new EthClient({ ...defaultEthParams, network: Network.Mainnet, phrase: seed }),
DASH: new DashClient({ ...defaultDashParams, network: Network.Mainnet, phrase: seed }),
KUJI: new KujiraClient({ ...defaultKujiParams, network: Network.Mainnet, phrase: seed }),
THOR: new ThorClient({ network: Network.Mainnet, phrase: seed }),
MAYA: new MayaClient({ network: Network.Mainnet, phrase: seed }),
})

console.log('============= Get all wallet balances ==============')
await _getBalances(wallet)
Expand Down
20 changes: 16 additions & 4 deletions packages/xchain-mayachain-amm/__tests__/mayachainAMM.test.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,31 @@
import { AssetBTC } from '@xchainjs/xchain-bitcoin'
import { AssetBTC, Client as BtcClient, defaultBTCParams as defaultBtcParams } from '@xchainjs/xchain-bitcoin'
import { Network } from '@xchainjs/xchain-client'
import { Client as DashClient, defaultDashParams } from '@xchainjs/xchain-dash'
import { Client as EthClient, defaultEthParams } from '@xchainjs/xchain-ethereum'
import { Client as KujiraClient, defaultKujiParams } from '@xchainjs/xchain-kujira'
import { Client as MayaClient } from '@xchainjs/xchain-mayachain'
import { MayachainQuery } from '@xchainjs/xchain-mayachain-query'
import { AssetRuneNative } from '@xchainjs/xchain-thorchain'
import { AssetRuneNative, Client as ThorClient } from '@xchainjs/xchain-thorchain'
import { CryptoAmount, assetToString, baseAmount } from '@xchainjs/xchain-util'
import { Wallet } from '@xchainjs/xchain-wallet'

import mayanodeApi from '../__mocks__/mayanode-api/mayanode-api'
import midgarApi from '../__mocks__/midgard-api/midgard-api'
import { MayachainAMM, Wallet } from '../src'
import { MayachainAMM } from '../src'

describe('Mayachain Client Test', () => {
let mayachainAmm: MayachainAMM

beforeAll(() => {
const mayaChainQuery = new MayachainQuery()
const wallet = new Wallet(process.env.MAINNET_PHRASE || '', Network.Mainnet)
const wallet = new Wallet({
BTC: new BtcClient({ ...defaultBtcParams, network: Network.Mainnet }),
ETH: new EthClient({ ...defaultEthParams, network: Network.Mainnet }),
DASH: new DashClient({ ...defaultDashParams, network: Network.Mainnet }),
KUJI: new KujiraClient({ ...defaultKujiParams, network: Network.Mainnet }),
THOR: new ThorClient({ network: Network.Mainnet }),
MAYA: new MayaClient({ network: Network.Mainnet }),
})
mayachainAmm = new MayachainAMM(mayaChainQuery, wallet)
})

Expand Down
3 changes: 2 additions & 1 deletion packages/xchain-mayachain-amm/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@
},
"dependencies": {
"@xchainjs/xchain-ethereum": "0.31.4",
"@xchainjs/xchain-kujira": "0.1.6"
"@xchainjs/xchain-kujira": "0.1.6",
"@xchainjs/xchain-wallet": "0.0.0"
},
"devDependencies": {
"@cosmos-client/core": "0.46.1",
Expand Down
1 change: 0 additions & 1 deletion packages/xchain-mayachain-amm/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,2 @@
export * from './wallet'
export * from './mayachain-amm'
export * from './types'
45 changes: 39 additions & 6 deletions packages/xchain-mayachain-amm/src/mayachain-amm.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
import { Client as BtcClient, defaultBTCParams as defaultBtcParams } from '@xchainjs/xchain-bitcoin'
import { Network } from '@xchainjs/xchain-client'
import { Client as DashClient, defaultDashParams } from '@xchainjs/xchain-dash'
import { AssetETH, Client as EthClient, defaultEthParams } from '@xchainjs/xchain-ethereum'
import { abi } from '@xchainjs/xchain-evm'
import { MAYAChain } from '@xchainjs/xchain-mayachain'
import { Client as KujiraClient, defaultKujiParams } from '@xchainjs/xchain-kujira'
import { Client as MayaClient, MAYAChain } from '@xchainjs/xchain-mayachain'
import { MayachainQuery, QuoteSwap, QuoteSwapParams } from '@xchainjs/xchain-mayachain-query'
import { CryptoAmount, baseAmount, getContractAddressFromAsset } from '@xchainjs/xchain-util'
import { Client as ThorClient } from '@xchainjs/xchain-thorchain'
import { Asset, CryptoAmount, baseAmount, getContractAddressFromAsset } from '@xchainjs/xchain-util'
import { Wallet } from '@xchainjs/xchain-wallet'
import { ethers } from 'ethers'

import { TxSubmitted } from './types'
import { Wallet } from './wallet'

/**
* MAYAChainAMM class for interacting with THORChain.
Expand All @@ -22,7 +27,17 @@ export class MayachainAMM {
* @param mayachainQuery - an instance of the MayachainQuery
* @returns MayachainAMM
*/
constructor(mayachainQuery = new MayachainQuery(), wallet = new Wallet('', Network.Mainnet)) {
constructor(
mayachainQuery = new MayachainQuery(),
wallet = new Wallet({
BTC: new BtcClient({ ...defaultBtcParams, network: Network.Mainnet }),
ETH: new EthClient({ ...defaultEthParams, network: Network.Mainnet }),
DASH: new DashClient({ ...defaultDashParams, network: Network.Mainnet }),
KUJI: new KujiraClient({ ...defaultKujiParams, network: Network.Mainnet }),
THOR: new ThorClient({ network: Network.Mainnet }),
MAYA: new MayaClient({ network: Network.Mainnet }),
}),
) {
this.mayachainQuery = mayachainQuery
this.wallet = wallet
}
Expand Down Expand Up @@ -118,7 +133,7 @@ export class MayachainAMM {
errors.push(`affiliateBps ${affiliateBps} out of range [0 - 10000]`)
}

if (this.wallet.isERC20Asset(fromAsset) && fromAddress) {
if (this.isERC20Asset(fromAsset) && fromAddress) {
const inboundDetails = await this.mayachainQuery.getChainInboundDetails(fromAsset.chain)
if (!inboundDetails.router) throw Error(`Unknown router address for ${fromAsset.chain}`)

Expand Down Expand Up @@ -201,7 +216,7 @@ export class MayachainAMM {
*/
private async doNonProtocolAssetSwap(amount: CryptoAmount, recipient: string, memo: string): Promise<TxSubmitted> {
// Non ERC20 swaps
if (!this.wallet.isERC20Asset(amount.asset)) {
if (!this.isERC20Asset(amount.asset)) {
const hash = await this.wallet.transfer({
asset: amount.asset,
amount: amount.baseAmount,
Expand Down Expand Up @@ -247,4 +262,22 @@ export class MayachainAMM {
url: await this.wallet.getExplorerTxUrl(amount.asset.chain, hash),
}
}

/**
* Check if asset is ERC20
* @param {Asset} asset to check
* @returns true if asset is ERC20, otherwise, false
*/
private isERC20Asset(asset: Asset): boolean {
return this.isEVMChain(asset.chain) ? [AssetETH.symbol].includes(asset.symbol) : false
}

/**
* Check if asset chain is EVM
* @param {Chain} chain to check
* @returns true if chain is EVM, otherwise, false
*/
private isEVMChain(chain: string): boolean {
return [AssetETH.chain].includes(chain)
}
}
1 change: 1 addition & 0 deletions packages/xchain-wallet/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Changelog
17 changes: 17 additions & 0 deletions packages/xchain-wallet/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# `@xchainjs/xchain-wallet`

XChainJS client wrapper to work with several XChainJS client at a time

## Install

```bash
yarn add @xchainjs/xchain-wallet
```

## Examples

To see an example, go to the wallet example of the examples folder of the repository

## Documentation

To be done
Loading
Loading