0.8.70-beta-0.2 • Published 7 months ago

@routerprotocol/router-chain-sdk-ts v0.8.70-beta-0.2

Weekly downloads
-
License
MIT
Repository
-
Last release
7 months ago

Overview

SDK for Router chain.

Refer to the documentation of Router chain SDK (ts): https://router-protocol.github.io/router-chain-ts-sdk/modules.html

Features

With this SDK, broadly following things can be done on Router chain -

  • Create a transaction.
  • Sign a transaction.
  • Broadcast a transaction.
  • Read any data and state.

Installation

yarn add @routerprotocol/router-chain-sdk-ts

or

npm i @routerprotocol/router-chain-sdk-ts

Code Snippets

import {
  getEndpointsForNetwork,
  Network,
} from '@routerprotocol/router-chain-sdk-ts';

const endpoint = getEndpointsForNetwork(Network.Testnet);
const bankClient = new ChainGrpcBankApi(endpoint.grpcEndpoint);

// Fetch all balances of an account
const accountBalances = await bankClient.fetchBalances(
  'router16sqwdtdxjl6zdvx49rvayhkyelfrhavpmknxh9'
);
console.log(accountBalances);

// Fetch particular coin's balance of an account
const routersBalances = await bankClient.fetchBalance({
  accountAddress: 'router16sqwdtdxjl6zdvx49rvayhkyelfrhavpmknxh9',
  denom: 'route',
});
console.log(routersBalances);

Sample response -

{
	balances: [ { denom: 'route', amount: '1000000000000000000000' } ],
	pagination: { total: 1, next: '' }
}

{ denom: 'route', amount: '1000000000000000000000' }

createTransaction returns the raw transaction and signed bytes. The signbytes can be signed and broadcasted to the chain.

const {
  DEFAULT_STD_FEE,
  createTransaction,
} = require('@routerprotocol/router-chain-sdk-ts');

const { signBytes, txRaw } = createTransaction({
  message: message.toDirectSign(),
  memo: '',
  fee: DEFAULT_STD_FEE,
  pubKey: publicKey,
  sequence: parseInt(aliceAccount.account.base_account.sequence, 10),
  accountNumber: parseInt(aliceAccount.account.base_account.account_number, 10),
  chainId: CHAIN_ID,
});

Given below is an example of bank transaction which can be used to send transfer funds -

const {
  getEndpointsForNetwork,
  Network,
  ChainRestAuthApi,
  PrivateKey,
  DEFAULT_STD_FEE,
  TxRestClient,
  createTransaction,
  MsgSend,
  privateKeyToPublicKeyBase64,
  isValidAddress,
  devnetChainInfo,
  sendEthTxnToRouterChain,
  getEthereumSignerAddress,
} = require('@routerprotocol/router-chain-sdk-ts');

const ROUTER_TO_SEND = '10';

const amount = {
  amount: expandDecimals(ROUTER_TO_SEND, 18).toString(),
  denom: 'route',
};

const endpoint = getEndpointsForNetwork(Network.Testnet);
const privateKeyHash = FAUCET_ACCOUNT_KEY;

/** Intializing Faucet wallet from the private key */
const privateKey = PrivateKey.fromPrivateKey(privateKeyHash);
const alice = privateKey.toBech32();
const alice_pubkey = privateKey.toPublicKey();

const publicKey = privateKeyToPublicKeyBase64(
  Buffer.from(privateKeyHash, 'hex')
);

/** Prepare the Message */
const message = MsgSend.fromJSON({
  amount,
  srcRouterAddress: alice,
  dstRouterAddress: destinationAddress,
});

/** Get Faucet Accounts details */
const aliceAccount = await new ChainRestAuthApi(
  endpoint.lcdEndpoint
).fetchAccount(alice);

/** Create Raw Transaction */
const txResponse = await sendEthTxnToRouterChain({
  networkEnv: Network.Testnet,
  txMsg: message,
  nodeUrl: endpoint.lcdEndpoint,
  ethereumAddress: getEthereumSignerAddress(alice),
  injectedSigner: privateKey
})

console.log(
  `Broadcasted transaction hash: ${JSON.stringify(txResponse.txhash)}`
);

Given below is an example of how MsgStoreCode can be used to upload a wasm contract file to router chain -

import {
  getEndpointsForNetwork,
  Network,
  getNetworkType,
  MsgStoreCode,
  PrivateKey,
  privateKeyToPublicKeyBase64,
  ChainRestAuthApi,
  createTransaction,
  DEFAULT_STD_FEE,
	BigNumberInBase,
  TxGrpcClient,
  TxRestClient,
  MsgInstantiateContract,
} from '../../router-chain-ts-sdk/src/';
import { sha256 } from '@cosmjs/crypto';
import { logs } from '@cosmjs/stargate';
import pako from 'pako';
import _m0 from 'protobufjs/minimal';
import * as fs from 'fs';

const privateKey = PrivateKey.fromPrivateKey(privateKeyHash);

const alice = privateKey.toBech32();
const alice_pubkey = privateKey.toPublicKey();

const publicKey = privateKeyToPublicKeyBase64(
	Buffer.from(privateKeyHash, "hex")
);

const endpoint =  getEndpointsForNetwork(Network.Testnet);

const restClient = new TxRestClient(endpoint.lcdEndpoint);

/** Get Faucet Accounts details */
  const aliceAccount = await new ChainRestAuthApi(
    endpoint.lcdEndpoint
  ).fetchAccount(alice);
  console.log(`aliceAccount => ${JSON.stringify(aliceAccount)}`);

  const compressed = pako.gzip(wasmCode, { level: 9 });

  const storeCodeMsg = MsgStoreCode.fromJSON({
    sender: alice,
    wasm: wasmCode,
  });

  /** Create Raw Transaction */
  const txResponse = await sendEthTxnToRouterChain({
    networkEnv: Network.Testnet,
    txMsg: message,
    nodeUrl: endpoint.lcdEndpoint,
    ethereumAddress: getEthereumSignerAddress(alice),
    injectedSigner: privateKey
  })
	console.log(`txResponse =>`, JSON.stringify(txResponse));

  const parsedLogs = logs.parseRawLog(txResponse.raw_log);
  const codeIdAttr = logs.findAttribute(parsedLogs, 'store_code', 'code_id');
  const codeId = Number.parseInt(codeIdAttr.value, 10),
  console.log(`deployedContract code id  =>`, codeId);

With MsgInstantiateContract we can instantiate the deployed contract with codeId -

import {
  getEndpointsForNetwork,
  getNetworkType,
  MsgStoreCode,
  PrivateKey,
  privateKeyToPublicKeyBase64,
  ChainRestAuthApi,
  createTransaction,
  DEFAULT_STD_FEE,
  BigNumberInBase,
  TxGrpcClient,
  TxRestClient,
  MsgInstantiateContract,
} from '../../router-chain-ts-sdk/src/';
import { sha256 } from '@cosmjs/crypto';
import { logs } from '@cosmjs/stargate';
import pako from 'pako';
import _m0 from 'protobufjs/minimal';
import * as fs from 'fs';

const privateKey = PrivateKey.fromPrivateKey(privateKeyHash);

const alice = privateKey.toBech32();
const alice_pubkey = privateKey.toPublicKey();

const publicKey = privateKeyToPublicKeyBase64(
  Buffer.from(privateKeyHash, 'hex')
);

const endpoint = getEndpointsForNetwork(Network.Testnet);

const restClient = new TxRestClient(endpoint.lcdEndpoint);
const aliceAccount = await new ChainRestAuthApi(
  endpoint.lcdEndpoint
).fetchAccount(alice);
console.log(`aliceAccount => ${JSON.stringify(aliceAccount)}`);

const intantiateContractMsg = MsgInstantiateContract.fromJSON({
  sender: alice,
  admin: alice,
  codeId: deployedContract.codeId,
  label: 'Mayank! Hello World',
  msg: {},
});

/** Create Raw Transaction */
const txResponse = await sendEthTxnToRouterChain({
  networkEnv: Network.Testnet,
  txMsg: intantiateContractMsg,
  nodeUrl: endpoint.lcdEndpoint,
  ethereumAddress: getEthereumSignerAddress(alice),
  injectedSigner: privateKey
})
console.log(
  `Broadcasted Instantiate transaction hash: ${JSON.stringify(
    txResponse.txhash
  )}`
);
``;
const parsedLogs = logs.parseRawLog(txResponse1.raw_log);
const contractAddressAttr = logs.findAttribute(
  parsedLogs,
  'instantiate',
  '_contract_address'
);
console.log(`Deployed contract address =>`, contractAddressAttr);
import {
  toUtf8,
  ChainGrpcWasmApi,
  getEndpointsForNetwork,
  getNetworkType,
  ChainGrpcBankApi,
} from '../../router-chain-ts-sdk/src';

const endpoint = getEndpointsForNetwork(Network.Testnet);

const wasmClient = new ChainGrpcWasmApi(endpoint.grpcEndpoint);
const bankClient = new ChainGrpcBankApi(endpoint.grpcEndpoint);
const request = {
  address: 'router1aaf9r6s7nxhysuegqrxv0wpm27ypyv4886medd3mrkrw6t4yfcns8a2l0y',
  queryData: toUtf8(JSON.stringify({ fetch_white_listed_contract: {} })),
};
const fetchRawContractStateResult = await wasmClient.fetchRawContractState(
  request.address,
  request.queryData
);
console.log('fetchRawContractState DATA =>', fetchRawContractStateResult);

const fetchContractCodeResult = await wasmClient.fetchContractCode(7);
console.log('fetchContractCodeResult =>', fetchContractCodeResult);

const fetchContractCodesResult = await wasmClient.fetchContractCodes();
console.log('fetchContractCodesResult =>', fetchContractCodesResult);

const fetchContractCodeContractsResult = await wasmClient.fetchContractCodeContracts(
  7
);
console.log(
  'fetchContractCodeContractsResult =>',
  fetchContractCodeContractsResult
);

const fetchContractHistoryResult = await wasmClient.fetchContractHistory(
  request.address
);
console.log('fetchContractHistoryResult =>', fetchContractHistoryResult);

const fetchContractInfoResult = await wasmClient.fetchContractInfo(
  request.address
);
console.log('fetchContractInfoResult =>', fetchContractInfoResult);

const fetchSmartContractStateResult = await wasmClient.fetchSmartContractState(
  request.address,
  request.queryData
);
console.log('fetchSmartContractStateResult =>', fetchSmartContractStateResult);

const fetchBalanceResult = await bankClient.fetchBalance({
  accountAddress: 'router1m0s0544sgdczf2sm6l8v6py7rrpr8a2cvnjezx',
  denom: 'route',
});
console.log('fetchBalanceResult =>', fetchBalanceResult);

With MsgExecuteContract you can execute any query on Router Chain.

import {
  getEndpointsForNetwork,
  getNetworkType,
  MsgStoreCode,
  PrivateKey,
  privateKeyToPublicKeyBase64,
  ChainRestAuthApi,
  createTransaction,
  DEFAULT_STD_FEE,
  BigNumberInBase,
  TxGrpcClient,
  TxRestClient,
  MsgInstantiateContract,
} from '../../router-chain-ts-sdk/src/';
import { sha256 } from '@cosmjs/crypto';
import { logs } from '@cosmjs/stargate';
import pako from 'pako';
import _m0 from 'protobufjs/minimal';
import { MsgExecuteContract } from '@routerprotocol/router-chain-sdk-ts';

const privateKey = PrivateKey.fromPrivateKey(privateKeyHash);

const alice = privateKey.toBech32();
const alice_pubkey = privateKey.toPublicKey();

const publicKey = privateKeyToPublicKeyBase64(
  Buffer.from(privateKeyHash, 'hex')
);
const restClient = new TxRestClient(endpoint.lcdEndpoint);

/** Get Faucet Accounts details */
const aliceAccount = await new ChainRestAuthApi(
  endpoint.lcdEndpoint
).fetchAccount(alice);

const executeContractMsg = MsgExecuteContract.fromJSON({
  sender: alice,
  action: 'white_list_application_contract',
  contractAddress:
    'router1aaf9r6s7nxhysuegqrxv0wpm27ypyv4886medd3mrkrw6t4yfcns8a2l0y',
  msg: {
    chain_id: '80001',
    chain_type: 0,
    contract_address: [
      171,
      132,
      131,
      246,
      77,
      156,
      109,
      30,
      207,
      155,
      132,
      154,
      230,
      119,
      221,
      51,
      21,
      131,
      92,
      178,
    ],
  },
});

/** Create Raw Transaction */
const txResponse = await sendEthTxnToRouterChain({
  networkEnv: Network.Testnet,
  txMsg: executeContractMsg,
  nodeUrl: endpoint.lcdEndpoint,
  ethereumAddress: getEthereumSignerAddress(alice),
  injectedSigner: privateKey
})
console.log(`txResponse =>`, txResponse);
import { ROUTER_DENOM, Network, MsgSend } from "@routerprotocol/router-chain-sdk-ts";

const amount = {
      amount: "10000000000000000000",
      denom: ROUTER_DENOM,
    };

const msgSendMsg = MsgSend.fromJSON({
  amount,
  srcRouterAddress: getRouterSignerAddress(window.ethereum.selectedAddress),
  dstRouterAddress: destinationAddress,
});
const RPC = getEndpointsForNetwork(Network.Testnet).lcdEndpoint
const tx = await sendEthTxnToRouterChain({
  networkEnv: Network.testnet,
  txMsg: msgSendMsg,
  nodeUrl: RPC,
  ethereumAddress: accountAddress,
  injectedSigner: window.ethereum,
});
const txHash = tx.tx_response.txhash
const restClient = new TxRestClient(RPC);
const txResponse = await restClient.waitTxBroadcast(txHash);

Executing a query on cosmwasm smart contract -

import {
  ROUTER_DENOM,
  Network,
  MsgExecuteCwContract,
} from '@routerprotocol/router-chain-sdk-ts';

const restClient = new TxRestClient(
  getEndpointsForNetwork(Network.Testnet).lcdEndpoint
);

const tx = await executeQueryInjected({
  networkEnv: Network.Testnet,
  contractAddress: 'router10390.......',
  executeMsg: yourQueryJSON,
  nodeUrl: getEndpointsForNetwork(Network.Testnet).lcdEndpoint,
  ethereumAddress: window.ethereum.selectedAddress,
  injectedSigner: window.ethereum,
});
const txHash = tx.tx_response.txhash;
const txResponse = await restClient.waitTxBroadcast(txHash);

Common Errors

For using the SDK with UI it is recommended to use node version v18.12.1 or above.

If you get webpack errors when using with create-react-app, follow these steps -

  1. Install craco and required packages.
yarn add -D @craco/craco
yarn add -D path-browserify stream-browserify stream-http https-browserify os-browserify assert url buffer process crypto-browsify fs
  1. Add craco.config.js file in your project root.
//craco.config.js

const { ProvidePlugin } = require('webpack');
module.exports = {
  webpack: {
    configure: webpackConfig => {
      return {
        ...webpackConfig,
        resolve: {
          ...webpackConfig.resolve,
          fallback: {
            ...(webpackConfig.resolve?.fallback ?? {}),
            path: require.resolve('path-browserify'),
            stream: require.resolve('stream-browserify'),
            buffer: require.resolve('buffer/'),
            crypto: require.resolve('crypto-browserify'),
            http: require.resolve('stream-http'),
            https: require.resolve('https-browserify'),
            os: require.resolve('os-browserify/browser'),
            assert: require.resolve('assert/'),
            url: require.resolve('url/'),
          },
        },
        plugins: [
          ...(webpackConfig.plugins ?? []),
          new ProvidePlugin({
            Buffer: ['buffer', 'Buffer'],
          }),
          new ProvidePlugin({
            process: 'process/browser',
          }),
        ],
      };
    },
  },
};
  1. Replace these scripts in package.json.
"scripts": {
		-  ~~"start": "react-scripts start"~~
		+  "start": "craco start"
		-  ~~"build": "react-scripts build"~~
		+  "build": "craco build"
		-  ~~"test": "react-scripts test"~~
		+  "test": "craco test"
}
  1. yarn start and the webpack errors should be gone.

If you get webpack errors when using vue’s nuxt framework, do this small change in nuxt.config.js build key -

build: {
    extend(config, ctx) {
      config.module.rules.push({
        test: /\.js$/, // apply this rule to .js files
        use: {
          loader: "babel-loader",
          options: {
            presets: ["@babel/preset-env"], // use the preset-env preset
          },
        },
      });
    },
  }
0.8.70-beta-0.2

7 months ago

0.8.70-beta-0.1

8 months ago

0.8.70

9 months ago

0.8.69-beta-3.8

9 months ago

0.8.69-beta-3.6

9 months ago

0.8.69-beta-3.7

9 months ago

0.8.69-beta-3.5

9 months ago

0.8.69-beta-3.4

9 months ago

0.8.69-beta-3.1

9 months ago

0.8.69-beta-3.2

9 months ago

0.8.69-beta-3.3

9 months ago

0.8.69-beta-3.0

10 months ago

0.8.69

1 year ago

0.8.68

1 year ago

0.8.69-beta-0.3

12 months ago

0.8.69-beta-0.4

12 months ago

0.8.69-beta-0.1

12 months ago

0.8.69-beta-0.2

12 months ago

0.8.69-beta-0.9

12 months ago

0.8.69-beta-0.7

12 months ago

0.8.69-beta-0.8

12 months ago

0.8.69-beta-0.5

12 months ago

0.8.69-beta-0.6

12 months ago

0.8.69-beta-1.2

12 months ago

0.8.69-beta-1.3

12 months ago

0.8.69-beta-1.1

12 months ago

0.8.69-beta-1.8

11 months ago

0.8.69-beta-1.9

11 months ago

0.8.69-beta-1.6

12 months ago

0.8.69-beta-1.4

12 months ago

0.8.69-beta-1.5

12 months ago

0.8.69-beta-2.1

11 months ago

0.8.69-beta-2.2

11 months ago

0.8.69-beta-2.0

11 months ago

0.8.69-beta-2.9

10 months ago

0.8.69-beta-2.7

10 months ago

0.8.69-beta-2.8

10 months ago

0.8.69-beta-2.5

10 months ago

0.8.69-beta-2.6

10 months ago

0.8.69-beta-2.3

11 months ago

0.8.69-beta-2.4

10 months ago

0.8.67-beta-0.4

1 year ago

0.8.67-beta-0.3

1 year ago

0.8.67-beta-0.6

12 months ago

0.8.67-beta-0.5

1 year ago

0.8.67-beta-0.2

1 year ago

0.8.67-beta-0.1

1 year ago

0.8.67

1 year ago

0.8.66-beta-2.3

1 year ago

0.8.66-beta-2.2

1 year ago

0.8.66-beta-2.1

1 year ago

0.8.66-beta-2.0

1 year ago

0.8.66-beta-1.9

1 year ago

0.8.66-beta-1.8

1 year ago

0.8.66-beta-1.7

2 years ago

0.8.66-beta-1.6

2 years ago

0.8.66

2 years ago

0.8.64

2 years ago

0.8.66-beta-1.3

2 years ago

0.8.66-beta-1.4

2 years ago

0.8.66-beta-1.1

2 years ago

0.8.66-beta-1.2

2 years ago

0.8.66-beta-1.5

2 years ago

0.8.63-beta-0.9

2 years ago

0.8.63-beta-0.8

2 years ago

0.8.63-beta-0.7

2 years ago

0.8.63-beta-0.6

2 years ago

0.8.63-beta-0.5

2 years ago

0.8.63-beta-0.4

2 years ago

0.8.63-beta-0.3

2 years ago

0.8.65-beta-1.8

2 years ago

0.8.65-beta-1.9

2 years ago

0.8.65-beta-1.4

2 years ago

0.8.65-beta-1.5

2 years ago

0.8.65-beta-1.6

2 years ago

0.8.65-beta-1.7

2 years ago

0.8.65-beta-1.0

2 years ago

0.8.65-beta-1.1

2 years ago

0.8.65-beta-1.2

2 years ago

0.8.65-beta-1.3

2 years ago

0.8.66-beta-0.1

2 years ago

0.8.66-beta-0.4

2 years ago

0.8.66-beta-0.5

2 years ago

0.8.66-beta-0.2

2 years ago

0.8.66-beta-0.3

2 years ago

0.8.66-beta-0.8

2 years ago

0.8.66-beta-0.9

2 years ago

0.8.66-beta-0.6

2 years ago

0.8.66-beta-0.7

2 years ago

0.8.65-beta-0.9

2 years ago

0.8.65-beta-0.5

2 years ago

0.8.65-beta-0.6

2 years ago

0.8.65-beta-0.7

2 years ago

0.8.65-beta-0.8

2 years ago

0.8.65-beta-0.1

2 years ago

0.8.65-beta-0.2

2 years ago

0.8.65-beta-0.3

2 years ago

0.8.65-beta-0.4

2 years ago

0.8.65-beta-2.0

2 years ago

0.8.63-beta-0.2

2 years ago

0.8.63

2 years ago

0.8.62

2 years ago

0.8.61

2 years ago

0.8.60

2 years ago

0.8.56

2 years ago

0.8.55

2 years ago

0.8.58

2 years ago

0.8.57

2 years ago

0.8.52

2 years ago

0.8.51

2 years ago

0.8.54

2 years ago

0.8.53

2 years ago

0.8.59

2 years ago

0.8.50

2 years ago

0.8.63-beta-0.1

2 years ago

0.8.45

2 years ago

0.8.44

2 years ago

0.8.47

2 years ago

0.8.46

2 years ago

0.8.41

2 years ago

0.8.40

2 years ago

0.8.43

2 years ago

0.8.42

2 years ago

0.8.49

2 years ago

0.8.48

2 years ago

0.8.34

2 years ago

0.8.33

2 years ago

0.8.36

2 years ago

0.8.35

2 years ago

0.8.30

2 years ago

0.8.32

2 years ago

0.8.31

2 years ago

0.8.38

2 years ago

0.8.37

2 years ago

0.8.39

2 years ago

0.8.23

2 years ago

0.8.22

2 years ago

0.8.25

2 years ago

0.8.24

2 years ago

0.8.21

2 years ago

0.8.20

2 years ago

0.8.27

2 years ago

0.8.26

2 years ago

0.8.29

2 years ago

0.8.28

2 years ago

0.8.61-beta0.1

2 years ago

0.8.59-beta-0.1

2 years ago

0.8.59-beta-0.3

2 years ago

0.8.59-beta-0.2

2 years ago

0.8.19

2 years ago

0.8.18

2 years ago

0.8.17

2 years ago

0.8.62-beta-0.1

2 years ago

0.7.163

2 years ago

0.8.9

2 years ago

0.7.162

2 years ago

0.8.8

2 years ago

0.7.165

2 years ago

0.7.164

2 years ago

0.7.167

2 years ago

0.8.5

2 years ago

0.7.166

2 years ago

0.8.4

2 years ago

0.7.169

2 years ago

0.8.7

2 years ago

0.7.168

2 years ago

0.8.6

2 years ago

0.7.161

2 years ago

0.7.160

2 years ago

0.7.159

2 years ago

0.7.152

2 years ago

0.7.151

2 years ago

0.7.154

2 years ago

0.7.153

2 years ago

0.7.156

2 years ago

0.7.155

2 years ago

0.7.158

2 years ago

0.7.157

2 years ago

0.7.150

2 years ago

0.7.149

2 years ago

0.7.148

2 years ago

0.7.99

2 years ago

0.7.95

2 years ago

0.7.94

2 years ago

0.7.91

2 years ago

0.7.90

2 years ago

0.7.93

2 years ago

0.7.92

2 years ago

0.7.88

2 years ago

0.7.87

2 years ago

0.7.89

2 years ago

0.7.84

2 years ago

0.7.83

2 years ago

0.7.86

2 years ago

0.7.85

2 years ago

0.7.170

2 years ago

0.7.172

2 years ago

0.7.171

2 years ago

0.8.1

2 years ago

0.7.80

2 years ago

0.8.0

2 years ago

0.8.3

2 years ago

0.7.82

2 years ago

0.8.2

2 years ago

0.7.81

2 years ago

0.7.33

2 years ago

0.7.32

2 years ago

0.7.35

2 years ago

0.7.34

2 years ago

0.7.31

2 years ago

0.7.30

2 years ago

0.7.37

2 years ago

0.7.36

2 years ago

0.7.38

2 years ago

0.7.22

2 years ago

0.7.21

2 years ago

0.7.24

2 years ago

0.7.23

2 years ago

0.7.20

2 years ago

0.7.29

2 years ago

0.7.26

2 years ago

0.7.25

2 years ago

0.7.28

2 years ago

0.7.27

2 years ago

0.7.101

2 years ago

0.7.100

2 years ago

0.7.103

2 years ago

0.7.102

2 years ago

0.7.19

2 years ago

0.7.18

2 years ago

0.7.17

2 years ago

0.7.16

2 years ago

0.7.77

2 years ago

0.7.76

2 years ago

0.7.121

2 years ago

0.7.79

2 years ago

0.7.120

2 years ago

0.7.78

2 years ago

0.7.123

2 years ago

0.7.73

2 years ago

0.7.122

2 years ago

0.7.72

2 years ago

0.7.125

2 years ago

0.7.75

2 years ago

0.7.124

2 years ago

0.7.74

2 years ago

0.7.116

2 years ago

0.7.115

2 years ago

0.7.118

2 years ago

0.7.71

2 years ago

0.7.117

2 years ago

0.7.70

2 years ago

0.7.119

2 years ago

0.7.66

2 years ago

0.7.65

2 years ago

0.7.110

2 years ago

0.7.68

2 years ago

0.7.67

2 years ago

0.7.112

2 years ago

0.7.62

2 years ago

0.7.111

2 years ago

0.7.61

2 years ago

0.7.114

2 years ago

0.7.64

2 years ago

0.7.113

2 years ago

0.7.63

2 years ago

0.7.69

2 years ago

0.7.105

2 years ago

0.7.104

2 years ago

0.7.107

2 years ago

0.7.60

2 years ago

0.7.106

2 years ago

0.7.109

2 years ago

0.7.108

2 years ago

0.7.141

2 years ago

0.7.55

2 years ago

0.7.140

2 years ago

0.7.54

2 years ago

0.7.143

2 years ago

0.7.57

2 years ago

0.7.142

2 years ago

0.7.56

2 years ago

0.7.145

2 years ago

0.7.51

2 years ago

0.7.144

2 years ago

0.7.50

2 years ago

0.7.147

2 years ago

0.7.53

2 years ago

0.7.146

2 years ago

0.7.52

2 years ago

0.7.59

2 years ago

0.7.58

2 years ago

0.7.138

2 years ago

0.7.137

2 years ago

0.7.139

2 years ago

0.8.12

2 years ago

0.7.130

2 years ago

0.8.11

2 years ago

0.8.14

2 years ago

0.7.132

2 years ago

0.7.46

2 years ago

0.8.13

2 years ago

0.7.131

2 years ago

0.7.134

2 years ago

0.7.40

2 years ago

0.7.133

2 years ago

0.8.10

2 years ago

0.7.136

2 years ago

0.7.42

2 years ago

0.7.135

2 years ago

0.7.41

2 years ago

0.8.16

2 years ago

0.7.48

2 years ago

0.8.15

2 years ago

0.7.47

2 years ago

0.7.49

2 years ago

0.7.127

2 years ago

0.7.126

2 years ago

0.7.129

2 years ago

0.7.128

2 years ago

0.7.11

2 years ago

0.7.10

2 years ago

0.7.9

2 years ago

0.7.13

2 years ago

0.7.12

2 years ago

0.7.6

2 years ago

0.7.8

2 years ago

0.7.7

2 years ago

0.7.15

2 years ago

0.7.14

2 years ago

0.6.7

2 years ago

0.6.6

2 years ago

0.6.9

2 years ago

0.6.8

2 years ago

0.7.2

2 years ago

0.7.1

2 years ago

0.7.4

2 years ago

0.7.3

2 years ago

0.7.0

2 years ago

0.7.5

2 years ago

0.6.3

2 years ago

0.6.2

2 years ago

0.6.5

2 years ago

0.6.4

2 years ago

0.6.1

2 years ago

0.6.0

3 years ago

0.4.9

3 years ago

0.4.8

3 years ago

0.3.0

3 years ago

0.5.4

3 years ago

0.3.6

3 years ago

0.3.5

3 years ago

0.5.6

3 years ago

0.3.8

3 years ago

0.5.5

3 years ago

0.3.7

3 years ago

0.1.9

3 years ago

0.5.0

3 years ago

0.3.2

3 years ago

0.3.1

3 years ago

0.5.2

3 years ago

0.3.4

3 years ago

0.5.1

3 years ago

0.3.3

3 years ago

0.5.8

3 years ago

0.5.7

3 years ago

0.3.9

3 years ago

0.5.9

3 years ago

0.2.1

3 years ago

0.2.0

3 years ago

0.4.5

3 years ago

0.2.7

3 years ago

0.4.4

3 years ago

0.2.6

3 years ago

0.4.7

3 years ago

0.2.9

3 years ago

0.4.6

3 years ago

0.2.8

3 years ago

0.4.1

3 years ago

0.2.3

3 years ago

0.4.0

3 years ago

0.2.2

3 years ago

0.4.3

3 years ago

0.2.5

3 years ago

0.4.2

3 years ago

0.2.4

3 years ago

0.1.8

3 years ago

0.1.7

3 years ago

0.1.6

3 years ago

0.1.5

3 years ago

0.1.4

3 years ago

0.1.3

3 years ago

0.1.2

3 years ago

0.1.1

3 years ago

0.1.0

3 years ago