0.8.66-beta-2.2 • Published 1 day ago

@routerprotocol/router-chain-sdk-ts v0.8.66-beta-2.2

Weekly downloads
-
License
MIT
Repository
-
Last release
1 day 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.Devnet);
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,
} = 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.Devnet);
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 { 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: devnetChainInfo.chainId,
});

/** Sign transaction */
const signature = await privateKey.sign(signBytes);

/** Append Signatures */
txRaw.setSignaturesList([signature]);

const txService = new TxRestClient(endpoint.lcdEndpoint);

/** Broadcast transaction */
const txResponse = await txService.broadcast(txRaw);

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.Devnet);

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,
  });

  const { signBytes, txRaw } = createTransaction({
		message: storeCodeMsg.toDirectSign(),
		memo: "",
		fee: {
			amount: [
				{
					amount: new BigNumberInBase(4000000000)
						.times(500000000)
						.toString(),
					denom: "route",
				},
			],
			gas: (500000000).toString(),
		},
		pubKey: publicKey,
		sequence: parseInt(aliceAccount.account.base_account.sequence, 10),
		accountNumber: parseInt(
			aliceAccount.account.base_account.account_number,
			10
		),
		chainId: "router-1",
	});

  /** Sign transaction */
  const signature = await privateKey.sign(signBytes);

  /** Append Signatures */
  txRaw.setSignaturesList([signature]);

  /** Broadcast transaction */
  let txxResponse = await restClient.broadcast(txRaw);
	let txResponse = await restClient. waitTxBroadcast(txxResponse.txhash);
	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.Devnet);

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: {},
});

const instantiateTx = createTransaction({
  message: intantiateContractMsg.toDirectSign(),
  memo: '',
  fee: {
    amount: [
      {
        amount: new BigNumberInBase(4000000000).times(500000000).toString(),
        denom: 'route',
      },
    ],
    gas: (500000000).toString(),
  },
  pubKey: publicKey,
  sequence: parseInt(aliceAccount.account.base_account.sequence, 10),
  accountNumber: parseInt(aliceAccount.account.base_account.account_number, 10),
  chainId: 'router-1',
});

/** Sign transaction */
const signature = await privateKey.sign(instantiateTx.signBytes);

/** Append Signatures */
instantiateTx.txRaw.setSignaturesList([signature]);
const txService = new TxGrpcClient(endpoint.grpcEndpoint);

/** Broadcast transaction */
const txResponse = await restClient.broadcast(instantiateTx.txRaw);
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.Devnet);

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,
    ],
  },
});

const { signBytes, txRaw } = createTransaction({
  message: executeContractMsg.toDirectSign(),
  memo: '',
  fee: {
    amount: [
      {
        amount: new BigNumberInBase(4000000000).times(500000000).toString(),
        denom: 'route',
      },
    ],
    gas: (500000000).toString(),
  },
  pubKey: publicKey,
  sequence: parseInt(aliceAccount.account.base_account.sequence, 10),
  accountNumber: parseInt(aliceAccount.account.base_account.account_number, 10),
  chainId: 'router-1',
});

/** Sign transaction */
const signature = await privateKey.sign(signBytes);

/** Append Signatures */
txRaw.setSignaturesList([signature]);

/** Broadcast transaction */
let txxResponse = await restClient.broadcast(txRaw);
let txResponse = await restClient.waitTxBroadcast(txxResponse.txhash);
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);

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,
    ],
  },
});

const { signBytes, txRaw } = createTransaction({
  message: executeContractMsg.toDirectSign(),
  memo: '',
  fee: {
    amount: [
      {
        amount: new BigNumberInBase(4000000000).times(500000000).toString(),
        denom: 'route',
      },
    ],
    gas: (500000000).toString(),
  },
  pubKey: publicKey,
  sequence: parseInt(aliceAccount.account.base_account.sequence, 10),
  accountNumber: parseInt(aliceAccount.account.base_account.account_number, 10),
  chainId: 'router-1',
});

/** Sign transaction */
const signature = await privateKey.sign(signBytes);

/** Append Signatures */
txRaw.setSignaturesList([signature]);

/** Broadcast transaction */
let txxResponse = await restClient.broadcast(txRaw);
let txResponse = await restClient.waitTxBroadcast(txxResponse.txhash);
console.log(`txResponse =>`, txResponse);

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.66-beta-2.0

3 months ago

0.8.66-beta-1.9

3 months ago

0.8.66-beta-1.8

3 months ago

0.8.66-beta-1.7

5 months ago

0.8.66-beta-1.6

5 months ago

0.8.66

6 months ago

0.8.64

10 months ago

0.8.65-beta-2.0.1

7 months ago

0.8.65-beta-2.0.2

6 months ago

0.8.66-beta-1.3

5 months ago

0.8.66-beta-1.4

5 months ago

0.8.66-beta-1.1

5 months ago

0.8.66-beta-1.2

5 months ago

0.8.66-beta-1.5

5 months ago

0.8.63-beta-0.9

10 months ago

0.8.63-beta-0.8

10 months ago

0.8.63-beta-0.7

10 months ago

0.8.63-beta-0.6

10 months ago

0.8.63-beta-0.5

10 months ago

0.8.63-beta-0.4

10 months ago

0.8.63-beta-0.3

10 months ago

0.8.65-beta-1.5.5

7 months ago

0.8.65-beta-1.5.1

7 months ago

0.8.65-beta-1.5.2

7 months ago

0.8.65-beta-1.5.3

7 months ago

0.8.65-beta-1.8

7 months ago

0.8.65-beta-1.9

7 months ago

0.8.65-beta-1.4

7 months ago

0.8.65-beta-1.5

7 months ago

0.8.65-beta-1.6

7 months ago

0.8.65-beta-1.7

7 months ago

0.8.65-beta-1.0

7 months ago

0.8.65-beta-1.1

7 months ago

0.8.65-beta-1.2

7 months ago

0.8.65-beta-1.3

7 months ago

0.8.66-beta-0.1

6 months ago

0.8.66-beta-0.4

6 months ago

0.8.66-beta-0.5

6 months ago

0.8.66-beta-0.2

6 months ago

0.8.66-beta-0.3

6 months ago

0.8.66-beta-0.8

6 months ago

0.8.66-beta-0.9

5 months ago

0.8.66-beta-0.6

6 months ago

0.8.66-beta-0.7

6 months ago

0.8.65-beta-0.9

7 months ago

0.8.65-beta-0.5

8 months ago

0.8.65-beta-0.6

8 months ago

0.8.65-beta-0.7

8 months ago

0.8.65-beta-0.8

7 months ago

0.8.65-beta-0.1

10 months ago

0.8.65-beta-0.2

10 months ago

0.8.65-beta-0.3

9 months ago

0.8.65-beta-0.4

8 months ago

0.8.65-beta-2.0

7 months ago

0.8.63-beta-0.2

10 months ago

0.8.63

11 months ago

0.8.62

11 months ago

0.8.61

11 months ago

0.8.60

11 months ago

0.8.56

11 months ago

0.8.55

11 months ago

0.8.58

11 months ago

0.8.57

11 months ago

0.8.52

11 months ago

0.8.51

11 months ago

0.8.54

11 months ago

0.8.53

11 months ago

0.8.59

11 months ago

0.8.50

11 months ago

0.8.63-beta-0.1

11 months ago

0.8.45

12 months ago

0.8.44

12 months ago

0.8.47

11 months ago

0.8.46

11 months ago

0.8.41

12 months ago

0.8.40

12 months ago

0.8.43

12 months ago

0.8.42

12 months ago

0.8.49

11 months ago

0.8.48

11 months ago

0.8.34

12 months ago

0.8.33

12 months ago

0.8.36

12 months ago

0.8.35

12 months ago

0.8.30

12 months ago

0.8.32

12 months ago

0.8.31

12 months ago

0.8.38

12 months ago

0.8.37

12 months ago

0.8.39

12 months ago

0.8.23

12 months ago

0.8.22

12 months ago

0.8.25

12 months ago

0.8.24

12 months ago

0.8.21

12 months ago

0.8.20

1 year ago

0.8.27

12 months ago

0.8.26

12 months ago

0.8.29

12 months ago

0.8.28

12 months ago

0.8.61-beta0.1

11 months ago

0.8.59-beta-0.1

11 months ago

0.8.59-beta-0.3

11 months ago

0.8.59-beta-0.2

11 months ago

0.8.19

1 year ago

0.8.18

1 year ago

0.8.17

1 year ago

0.8.62-beta-0.1

11 months ago

0.7.163

1 year ago

0.8.9

1 year ago

0.7.162

1 year ago

0.8.8

1 year ago

0.7.165

1 year ago

0.7.164

1 year ago

0.7.167

1 year ago

0.8.5

1 year ago

0.7.166

1 year ago

0.8.4

1 year ago

0.7.169

1 year ago

0.8.7

1 year ago

0.7.168

1 year ago

0.8.6

1 year ago

0.7.161

1 year ago

0.7.160

1 year ago

0.7.159

1 year ago

0.7.152

1 year ago

0.7.151

1 year ago

0.7.154

1 year ago

0.7.153

1 year ago

0.7.156

1 year ago

0.7.155

1 year ago

0.7.158

1 year ago

0.7.157

1 year ago

0.7.150

1 year ago

0.7.149

1 year ago

0.7.148

1 year ago

0.7.99

1 year ago

0.7.95

1 year ago

0.7.94

1 year ago

0.7.91

1 year ago

0.7.90

1 year ago

0.7.93

1 year ago

0.7.92

1 year ago

0.7.88

1 year ago

0.7.87

1 year ago

0.7.89

1 year ago

0.7.84

1 year ago

0.7.83

1 year ago

0.7.86

1 year ago

0.7.85

1 year ago

0.7.170

1 year ago

0.7.172

1 year ago

0.7.171

1 year ago

0.8.1

1 year ago

0.7.80

1 year ago

0.8.0

1 year ago

0.8.3

1 year ago

0.7.82

1 year ago

0.8.2

1 year ago

0.7.81

1 year ago

0.7.33

1 year ago

0.7.32

1 year ago

0.7.35

1 year ago

0.7.34

1 year ago

0.7.31

1 year ago

0.7.30

1 year ago

0.7.37

1 year ago

0.7.36

1 year ago

0.7.38

1 year ago

0.7.22

1 year ago

0.7.21

1 year ago

0.7.24

1 year ago

0.7.23

1 year ago

0.7.20

1 year ago

0.7.29

1 year ago

0.7.26

1 year ago

0.7.25

1 year ago

0.7.28

1 year ago

0.7.27

1 year ago

0.7.101

1 year ago

0.7.100

1 year ago

0.7.103

1 year ago

0.7.102

1 year ago

0.7.19

1 year ago

0.7.18

1 year ago

0.7.17

1 year ago

0.7.16

1 year ago

0.7.77

1 year ago

0.7.76

1 year ago

0.7.121

1 year ago

0.7.79

1 year ago

0.7.120

1 year ago

0.7.78

1 year ago

0.7.123

1 year ago

0.7.73

1 year ago

0.7.122

1 year ago

0.7.72

1 year ago

0.7.125

1 year ago

0.7.75

1 year ago

0.7.124

1 year ago

0.7.74

1 year ago

0.7.116

1 year ago

0.7.115

1 year ago

0.7.118

1 year ago

0.7.71

1 year ago

0.7.117

1 year ago

0.7.70

1 year ago

0.7.119

1 year ago

0.7.66

1 year ago

0.7.65

1 year ago

0.7.110

1 year ago

0.7.68

1 year ago

0.7.67

1 year ago

0.7.112

1 year ago

0.7.62

1 year ago

0.7.111

1 year ago

0.7.61

1 year ago

0.7.114

1 year ago

0.7.64

1 year ago

0.7.113

1 year ago

0.7.63

1 year ago

0.7.69

1 year ago

0.7.105

1 year ago

0.7.104

1 year ago

0.7.107

1 year ago

0.7.60

1 year ago

0.7.106

1 year ago

0.7.109

1 year ago

0.7.108

1 year ago

0.7.141

1 year ago

0.7.55

1 year ago

0.7.140

1 year ago

0.7.54

1 year ago

0.7.143

1 year ago

0.7.57

1 year ago

0.7.142

1 year ago

0.7.56

1 year ago

0.7.145

1 year ago

0.7.51

1 year ago

0.7.144

1 year ago

0.7.50

1 year ago

0.7.147

1 year ago

0.7.53

1 year ago

0.7.146

1 year ago

0.7.52

1 year ago

0.7.59

1 year ago

0.7.58

1 year ago

0.7.138

1 year ago

0.7.137

1 year ago

0.7.139

1 year ago

0.8.12

1 year ago

0.7.130

1 year ago

0.8.11

1 year ago

0.8.14

1 year ago

0.7.132

1 year ago

0.7.46

1 year ago

0.8.13

1 year ago

0.7.131

1 year ago

0.7.134

1 year ago

0.7.40

1 year ago

0.7.133

1 year ago

0.8.10

1 year ago

0.7.136

1 year ago

0.7.42

1 year ago

0.7.135

1 year ago

0.7.41

1 year ago

0.8.16

1 year ago

0.7.48

1 year ago

0.8.15

1 year ago

0.7.47

1 year ago

0.7.49

1 year ago

0.7.127

1 year ago

0.7.126

1 year ago

0.7.129

1 year ago

0.7.128

1 year ago

0.7.11

1 year ago

0.7.10

1 year ago

0.7.9

1 year ago

0.7.13

1 year ago

0.7.12

1 year ago

0.7.6

1 year ago

0.7.8

1 year ago

0.7.7

1 year ago

0.7.15

1 year ago

0.7.14

1 year ago

0.6.7

1 year ago

0.6.6

1 year ago

0.6.9

1 year ago

0.6.8

1 year ago

0.7.2

1 year ago

0.7.1

1 year ago

0.7.4

1 year ago

0.7.3

1 year ago

0.7.0

1 year ago

0.7.5

1 year ago

0.6.3

1 year ago

0.6.2

1 year ago

0.6.5

1 year ago

0.6.4

1 year ago

0.6.1

1 year ago

0.6.0

1 year ago

0.4.9

1 year ago

0.4.8

1 year ago

0.3.0

2 years ago

0.5.4

1 year ago

0.3.6

1 year ago

0.3.5

1 year ago

0.5.6

1 year ago

0.3.8

1 year ago

0.5.5

1 year ago

0.3.7

1 year ago

0.1.9

2 years ago

0.5.0

1 year ago

0.3.2

2 years ago

0.3.1

2 years ago

0.5.2

1 year ago

0.3.4

1 year ago

0.5.1

1 year ago

0.3.3

2 years ago

0.5.8

1 year ago

0.5.7

1 year ago

0.3.9

1 year ago

0.5.9

1 year ago

0.2.1

2 years ago

0.2.0

2 years ago

0.4.5

1 year ago

0.2.7

2 years ago

0.4.4

1 year ago

0.2.6

2 years ago

0.4.7

1 year ago

0.2.9

2 years ago

0.4.6

1 year ago

0.2.8

2 years ago

0.4.1

1 year ago

0.2.3

2 years ago

0.4.0

1 year ago

0.2.2

2 years ago

0.4.3

1 year ago

0.2.5

2 years ago

0.4.2

1 year ago

0.2.4

2 years ago

0.1.8

2 years ago

0.1.7

2 years ago

0.1.6

2 years ago

0.1.5

2 years ago

0.1.4

2 years ago

0.1.3

2 years ago

0.1.2

2 years ago

0.1.1

2 years ago

0.1.0

2 years ago