diff --git a/CHANGELOG.md b/CHANGELOG.md
index 11fa80d81..3a44adc2c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,7 @@
# Changelog
## [UNRELEASED]
+* [#529] Upgraded ledger transactions to stargate format
* [#523] Implemented readable messages for IBC messages
## [v0.41.x-14.2]
diff --git a/client/main.js b/client/main.js
index 528dd4e48..5dde11831 100644
--- a/client/main.js
+++ b/client/main.js
@@ -15,7 +15,8 @@ CURRENTUSERADDR = 'ledgerUserAddress';
CURRENTUSERPUBKEY = 'ledgerUserPubKey';
BLELEDGERCONNECTION = 'ledgerBLEConnection'
ADDRESSINDEX = 'addressIndex'
-
+RPC = Meteor.settings.public.remote.rpc;
+API = Meteor.settings.public.remote.api;
// import { onPageLoad } from 'meteor/server-render';
diff --git a/default_settings.json b/default_settings.json
index c9933a8ff..58306c643 100644
--- a/default_settings.json
+++ b/default_settings.json
@@ -40,14 +40,14 @@
"gov": true,
"distribution": false
},
+ "remote": {
+ "rpc": "https://rpc.stargate.forbole.com:443",
+ "api": "https://api.stargate.forbole.com:443"
+ },
"coingeckoId": "cosmos",
"networks": "https://gist.githubusercontent.com/kwunyeung/8be4598c77c61e497dfc7220a678b3ee/raw/bd-networks.json",
"banners": false
},
- "remote":{
- "rpc":"https://rpc.stargate.forbole.com:443",
- "api":"https://api.stargate.forbole.com:443"
- },
"debug": {
"startTimer": true
},
diff --git a/imports/api/ledger/server/methods.js b/imports/api/ledger/server/methods.js
index 0626aa4fe..ea8ec6a43 100644
--- a/imports/api/ledger/server/methods.js
+++ b/imports/api/ledger/server/methods.js
@@ -2,25 +2,6 @@ import { HTTP } from 'meteor/http';
import { Validators } from '../../validators/validators';
Meteor.methods({
- 'transaction.submit': function(txInfo) {
- this.unblock();
- const url = `${API}/txs`;
- data = {
- "tx": txInfo.value,
- "mode": "sync"
- }
- const timestamp = new Date().getTime();
- console.log(`submitting transaction${timestamp} ${url} with data ${JSON.stringify(data)}`)
-
- let response = HTTP.post(url, {data});
- console.log(`response for transaction${timestamp} ${url}: ${JSON.stringify(response)}`)
- if (response.statusCode == 200) {
- let data = response.data
- if (data.code)
- throw new Meteor.Error(data.code, JSON.parse(data.raw_log).message)
- return response.data.txhash;
- }
- },
'transaction.execute': function(body, path) {
this.unblock();
const url = `${API}/${path}`;
diff --git a/imports/ui/ledger/LedgerActions.jsx b/imports/ui/ledger/LedgerActions.jsx
index 2e5d76cd0..93023d2e4 100644
--- a/imports/ui/ledger/LedgerActions.jsx
+++ b/imports/ui/ledger/LedgerActions.jsx
@@ -426,7 +426,7 @@ class LedgerButton extends Component {
if (res){
let gasPrice = calculateGasPrice(res)
let amountToTransfer = this.state.transferAmount?.amount || this.state.delegateAmount?.amount || this.state.depositAmount?.amount
- let totalAmount = this.props.rewards || this.props.commission || this.state.actionType === 'redelegate' || this.state.actionType === 'undelegate'? gasPrice : amountToTransfer + gasPrice;
+ let totalAmount = this.props.rewards || this.props.commission || this.state.actionType === 'redelegate' || this.state.actionType === 'undelegate' || this.state.actionType === 'vote'? gasPrice : amountToTransfer + gasPrice;
if (totalAmount <= this.state.currentUser?.availableCoin?._amount){
Ledger.applyGas(txMsg, res, Meteor.settings.public.ledger.gasPrice, Coin.StakingCoin.denom);
this.setStateOnSuccess('simulating', {
@@ -452,23 +452,25 @@ class LedgerButton extends Component {
let txMsg = this.state.txMsg;
const txContext = this.getTxContext();
const bytesToSign = Ledger.getBytesToSign(txMsg, txContext);
- this.ledger.sign(bytesToSign, this.state.transportBLE).then((sig) => {
- try {
- Ledger.applySignature(txMsg, txContext, sig);
- Meteor.call('transaction.submit', txMsg, (err, res) => {
- if (err) {
- this.setStateOnError('signing', err.reason)
- } else if (res) {
- this.setStateOnSuccess('signing', {
- txHash: res,
- activeTab: '4'
- })
- }
+
+ if (txMsg.value.msg[0].type === "cosmos-sdk/MsgVote" ||
+ txMsg.value.msg[0].type === "cosmos-sdk/MsgDeposit" ||
+ txMsg.value.msg[0].type === "cosmos-sdk/MsgSubmitProposal") {
+ this.ledger.signAmino(txMsg, txContext, this.state.transportBLE).then((res) => {
+ this.setStateOnSuccess('signing', {
+ txHash: res,
+ activeTab: '4'
})
- } catch (e) {
- this.setStateOnError('signing', e.message)
- }
- }, (err) => this.setStateOnError('signing', err.message))
+ }, (err) => this.setStateOnError('signing', err.message))
+ }
+ else {
+ this.ledger.signTx(txMsg, txContext, this.state.transportBLE).then((hash) => {
+ this.setStateOnSuccess('signing', {
+ txHash: hash,
+ activeTab: '4'
+ })
+ }, (err) => this.setStateOnError('signing', err.message))
+ }
} catch (e) {
this.setStateOnError('signing', e.message)
}
@@ -769,10 +771,10 @@ class DelegationButtons extends LedgerButton {
class WithdrawButton extends LedgerButton {
createMessage = (callback) => {
- Meteor.call('transaction.execute', {from: this.state.user}, this.getPath(), (err, res) =>{
- if (res){
+ Meteor.call('transaction.execute', { from: this.state.user }, this.getPath(), (err, res) => {
+ if (res) {
Meteor.call('isValidator', this.state.user, (error, result) => {
- if (result && result.operator_address){
+ if (result && result.operator_address) {
res.value.msg.push({
type: 'cosmos-sdk/MsgWithdrawValidatorCommission',
value: { validator_address: result.operator_address }
@@ -960,7 +962,6 @@ class ProposalActionButtons extends LedgerButton {
renderActionTab = () => {
if (!this.state.currentUser) return null;
let maxAmount = this.state.currentUser.availableCoin;
-
let inputs;
let title;
switch (this.state.actionType) {
@@ -968,10 +969,10 @@ class ProposalActionButtons extends LedgerButton {
title=`Vote on Proposal ${this.props.proposalId}`
inputs = (
-
-
-
-
+
+
+
+
)
break;
case Types.DEPOSIT:
@@ -982,8 +983,8 @@ class ProposalActionButtons extends LedgerButton {
min={Coin.MinStake} max={maxAmount.stakingAmount} type="number"
invalid={this.state.depositAmount != null && !isBetween(this.state.depositAmount, 1, maxAmount)}/>
{Coin.StakingCoin.displayName}
-
- )
+
+ )
break;
}
return
@@ -991,6 +992,7 @@ class ProposalActionButtons extends LedgerButton {
{inputs}
+ {this.state.actionType === 'deposit' ? : null}
}
@@ -1018,7 +1020,7 @@ class ProposalActionButtons extends LedgerButton {
isDataValid = () => {
if (!this.state.currentUser) return false
if (this.state.actionType === Types.VOTE) {
- return ['Yes', 'No', 'NoWithVeto', 'Abstain'].indexOf(this.state.voteOption) !== -1;
+ return ['VOTE_OPTION_YES', 'VOTE_OPTION_NO', 'VOTE_OPTION_NO_WITH_VETO', 'VOTE_OPTION_ABSTAIN'].indexOf(this.state.voteOption) !== -1;
} else {
return isBetween(this.state.depositAmount, 1, this.state.currentUser.availableCoin)
}
@@ -1027,7 +1029,7 @@ class ProposalActionButtons extends LedgerButton {
getConfirmationMessage = () => {
switch (this.state.actionType) {
case Types.VOTE:
- return You are voting {this.state.voteOption} on proposal {this.props.proposalId}
+ return You are voting {this.state.voteOption?.substring(12).replace(/_/g, " ")} on proposal {this.props.proposalId}
with .
break;
diff --git a/imports/ui/ledger/ledger.js b/imports/ui/ledger/ledger.js
index 330103c63..ff98d8c22 100644
--- a/imports/ui/ledger/ledger.js
+++ b/imports/ui/ledger/ledger.js
@@ -11,6 +11,18 @@ import bech32 from "bech32";
import sha256 from "crypto-js/sha256"
import ripemd160 from "crypto-js/ripemd160"
import CryptoJS from "crypto-js"
+import { LedgerSigner } from "@cosmjs/ledger-amino";
+import { SigningCosmosClient, makeSignDoc } from "@cosmjs/launchpad";
+import { sleep } from "@cosmjs/utils";
+import { SigningStargateClient, assertIsBroadcastTxSuccess, defaultRegistryTypes, makeCosmoshubPath } from "@cosmjs/stargate"
+import { Registry } from '@cosmjs/proto-signing';
+import {
+ MsgDelegate,
+ MsgUndelegate,
+ MsgBeginRedelegate
+} from '@cosmjs/stargate/build/codec/cosmos/staking/v1beta1/tx';
+import { MsgSend } from '@cosmjs/stargate/build/codec/cosmos/bank/v1beta1/tx';
+import { MsgWithdrawValidatorCommission, MsgWithdrawDelegatorReward } from '@cosmjs/stargate/build/codec/cosmos/distribution/v1beta1/tx';
// TODO: discuss TIMEOUT value
const INTERACTION_TIMEOUT = 10000
@@ -100,7 +112,7 @@ export class Ledger {
transport= await TransportWebUSB.create(timeout)
}
const cosmosLedgerApp = new CosmosApp(transport)
-
+ this.ledgerSigner = this.getLedgerWallet(transport)
this.cosmosApp = cosmosLedgerApp
await this.isSendingData()
@@ -177,16 +189,146 @@ export class Ledger {
})
}
- async sign(signMessage, transportBLE) {
+ getLedgerWallet(ledgerTransport) {
+ return new LedgerSigner(ledgerTransport, { hdPaths: [makeCosmoshubPath(0)] });
+ }
+
+ async signTx(txMsg, txContext, transportBLE) {
await this.connect(INTERACTION_TIMEOUT, transportBLE)
+ let address = txContext.bech32;
+ let fee = txMsg.value.fee
+ const myRegistry = new Registry([...defaultRegistryTypes]);
+
+ const client = await SigningStargateClient.connectWithSigner(
+ RPC,
+ this.ledgerSigner,
+ 'sync'
+ );
+
+ const formatMessage = (option) => {
+ switch (option) {
+ case "cosmos-sdk/MsgDelegate":
+ return {
+ typeUrl: '/cosmos.staking.v1beta1.MsgDelegate',
+ value: MsgDelegate.fromPartial({
+ amount: txMsg.value.msg[0].value.amount,
+ delegatorAddress: address,
+ validatorAddress: txMsg.value.msg[0].value.validator_address,
+ })
+ }
+ case "cosmos-sdk/MsgUndelegate":
+ return {
+ typeUrl: '/cosmos.staking.v1beta1.MsgUndelegate',
+ value: MsgUndelegate.fromPartial({
+ amount: txMsg.value.msg[0].value.amount,
+ delegatorAddress: address,
+ validatorAddress: txMsg.value.msg[0].value.validator_address,
+ })
+ }
+ case "cosmos-sdk/MsgBeginRedelegate":
+ return {
+ typeUrl: '/cosmos.staking.v1beta1.MsgBeginRedelegate',
+ value: MsgBeginRedelegate.fromPartial({
+ amount: txMsg.value.msg[0].value.amount,
+ delegatorAddress: address,
+ validatorDstAddress: txMsg.value.msg[0].value.validator_dst_address,
+ validatorSrcAddress: txMsg.value.msg[0].value.validator_src_address,
+ })
+ }
+ case "cosmos-sdk/MsgSend":
+ return {
+ typeUrl: '/cosmos.bank.v1beta1.MsgSend',
+ value: MsgSend.fromPartial({
+ fromAddress: address,
+ toAddress: txMsg.value.msg[0].value.to_address,
+ amount: txMsg.value.msg[0].value.amount,
+ }),
+ }
+ case "cosmos-sdk/MsgWithdrawDelegationReward":
+ return {
+ typeUrl: '/cosmos.distribution.v1beta1.MsgWithdrawDelegatorReward',
+ value: MsgWithdrawDelegatorReward.fromPartial({
+ delegatorAddress: txMsg.value.msg[0].value.delegator_address,
+ validatorAddress: txMsg.value.msg[0].value.validator_address
+ })
+ }
+ case "cosmos-sdk/MsgWithdrawValidatorCommission":
+ return {
+ typeUrl: '/cosmos.distribution.v1beta1.MsgWithdrawValidatorCommission',
+ value: MsgWithdrawValidatorCommission.fromPartial({
+ validatorAddress: txMsg.value.msg[0].operator_address
+ })
+ }
+ }
+ }
- const response = await this.cosmosApp.sign(this.getHDPath(), signMessage)
- this.checkLedgerErrors(response)
- // we have to parse the signature from Ledger as it's in DER format
- const parsedSignature = signatureImport(response.signature)
- return parsedSignature
+ let msg = txMsg.value.msg.length > 1 ? txMsg.value.msg.map((m) => formatMessage(m.type)) : formatMessage(txMsg.value.msg[0].type)
+ const result = await client.signAndBroadcast(
+ address,
+ [msg],
+ fee,
+ DEFAULT_MEMO
+ );
+ return result.transactionHash
}
+ async signAmino(txMsg, txContext, transportBLE) {
+ await this.connect(INTERACTION_TIMEOUT, transportBLE)
+ let address = txContext.bech32;
+ let fee = txMsg.value.fee;
+ let chainId = txContext.chainId;
+ let accountNumber = txContext.accountNumber.toString();
+ let sequence = txContext.sequence.toString();
+ let signAmino, txResult;
+
+ const getVoteOption = (option) =>{
+ switch (option) {
+ case "VOTE_OPTION_YES":
+ return 1;
+ case "VOTE_OPTION_ABSTAIN":
+ return 2;
+ case "VOTE_OPTION_NO":
+ return 3;
+ case "VOTE_OPTION_NO_WITH_VETO":
+ return 4;
+ }
+ }
+
+ const client = new SigningCosmosClient(API, address, this.ledgerSigner, undefined, undefined, 'sync')
+ if (txMsg.value.msg[0].value.option){
+ txMsg.value.msg[0].value.option = getVoteOption(txMsg.value.msg[0].value.option)
+ }
+ let msgs = txMsg.value.msg[0]
+ const signDoc = makeSignDoc(
+ [msgs],
+ fee,
+ chainId,
+ DEFAULT_MEMO,
+ accountNumber,
+ sequence
+ );
+
+ signAmino = await this.ledgerSigner.signAmino(
+ txContext.bech32,
+ signDoc
+ );
+ this.checkLedgerErrors(signAmino)
+
+ const tx = {
+ msg: [msgs],
+ fee: fee,
+ memo: DEFAULT_MEMO,
+ signatures: [signAmino.signature],
+ };
+
+ txResult = await client.broadcastTx(tx);
+ await sleep(75);
+ assertIsBroadcastTxSuccess(txResult);
+
+ let txHash = txResult?.transactionHash ?? ''
+ return txHash
+ };
+
/* istanbul ignore next: maps a bunch of errors */
checkLedgerErrors(
{ error_message, device_locked },
@@ -198,34 +340,36 @@ export class Ledger {
if (device_locked) {
throw new Error(`Ledger's screensaver mode is on`)
}
- switch (error_message) {
- case `U2F: Timeout`:
- throw new Error(timeoutMessag)
- case `${Meteor.settings.public.ledger.appName} app does not seem to be open`:
+ if(error_message != null){
+ switch (error_message) {
+ case `U2F: Timeout`:
+ throw new Error(timeoutMessag)
+ case `${Meteor.settings.public.ledger.appName} app does not seem to be open`:
// hack:
// It seems that when switching app in Ledger, WebUSB will disconnect, disabling further action.
// So we clean up here, and re-initialize this.cosmosApp next time when calling `connect`
- this.cosmosApp.transport.close()
- this.cosmosApp = undefined
- throw new Error(`${Meteor.settings.public.ledger.appName} app is not open`)
- case `Command not allowed`:
- throw new Error(`Transaction rejected`)
- case `Transaction rejected`:
- throw new Error(rejectionMessage)
- case `Unknown error code`:
- throw new Error(`Ledger's screensaver mode is on`)
- case `Instruction not supported`:
- throw new Error(
- `Your ${Meteor.settings.public.ledger.appName} Ledger App is not up to date. ` +
+ this.cosmosApp.transport.close()
+ this.cosmosApp = undefined
+ throw new Error(`${Meteor.settings.public.ledger.appName} app is not open`)
+ case `Command not allowed`:
+ throw new Error(`Transaction rejected`)
+ case `Transaction rejected`:
+ throw new Error(rejectionMessage)
+ case `Unknown error code`:
+ throw new Error(`Ledger's screensaver mode is on`)
+ case `Instruction not supported`:
+ throw new Error(
+ `Your ${Meteor.settings.public.ledger.appName} Ledger App is not up to date. ` +
`Please update to version ${REQUIRED_COSMOS_APP_VERSION}.`
- )
- case `Web Bluetooth API globally disabled`:
- throw new Error(`Bluetooth not supported. Please use the latest version of Chrome browser.`)
- case `No errors`:
+ )
+ case `Web Bluetooth API globally disabled`:
+ throw new Error(`Bluetooth not supported. Please use the latest version of Chrome browser.`)
+ case `No errors`:
// do nothing
- break
- default:
- throw new Error(error_message)
+ break
+ default:
+ throw new Error(error_message)
+ }
}
}
diff --git a/imports/ui/proposals/Proposal.jsx b/imports/ui/proposals/Proposal.jsx
index d7ef6f60f..da348950b 100644
--- a/imports/ui/proposals/Proposal.jsx
+++ b/imports/ui/proposals/Proposal.jsx
@@ -14,7 +14,7 @@ import i18n from 'meteor/universe:i18n';
import { Meteor } from 'meteor/meteor';
import Coin from '/both/utils/coins.js';
import TimeStamp from '../components/TimeStamp.jsx';
-// import { ProposalActionButtons } from '../ledger/LedgerActions.jsx';
+import { ProposalActionButtons } from '../ledger/LedgerActions.jsx';
import voca from 'voca';
const T = i18n.createComponent();
@@ -293,7 +293,7 @@ export default class Proposal extends Component{
proposals.proposalID
{this.props.proposal.proposalId}
- {/* {this.state.user?:null} */}
+ {this.state.user?:null}
proposals.proposer
diff --git a/package-lock.json b/package-lock.json
index e68db2b43..e42ebada3 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -173,6 +173,188 @@
"to-fast-properties": "^2.0.0"
}
},
+ "@confio/ics23": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/@confio/ics23/-/ics23-0.6.5.tgz",
+ "integrity": "sha512-1GdPMsaP/l8JSF4P4HWFLBhdcxHcJT8lS0nknBYNSZ1XrJOsJKUy6EkOwd9Pa1qJkXzY2gyNv7MdHR+AIwSTAg==",
+ "requires": {
+ "js-sha512": "^0.8.0",
+ "protobufjs": "^6.8.8",
+ "ripemd160": "^2.0.2",
+ "sha.js": "^2.4.11"
+ }
+ },
+ "@cosmjs/amino": {
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.25.5.tgz",
+ "integrity": "sha512-q9tU2b9hJ3S/KxYCLSyiZCfkaidbSPBr2sJ5HPLxz48y5O4k9sYM7bPa0zioeePaIBnby3AOgyjucVxlbzUlYg==",
+ "requires": {
+ "@cosmjs/crypto": "^0.25.5",
+ "@cosmjs/encoding": "^0.25.5",
+ "@cosmjs/math": "^0.25.5",
+ "@cosmjs/utils": "^0.25.5"
+ }
+ },
+ "@cosmjs/crypto": {
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.25.5.tgz",
+ "integrity": "sha512-i0Nfbk4JXAwyKNGPFu0o1xV6IJUbYmmveySytbU/yweybcZppxoczjSQ1sGrUaLVLvgfcpfwZte3jKqDR67+dg==",
+ "requires": {
+ "@cosmjs/encoding": "^0.25.5",
+ "@cosmjs/math": "^0.25.5",
+ "@cosmjs/utils": "^0.25.5",
+ "bip39": "^3.0.2",
+ "bn.js": "^4.11.8",
+ "elliptic": "^6.5.3",
+ "js-sha3": "^0.8.0",
+ "libsodium-wrappers": "^0.7.6",
+ "ripemd160": "^2.0.2",
+ "sha.js": "^2.4.11"
+ }
+ },
+ "@cosmjs/encoding": {
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.25.5.tgz",
+ "integrity": "sha512-QT7MaPBiMeCaMJ6VZZKeOqDQlAxMEzTFjBFhbkdyx5DVRc4dPOVO4HbTggmIN5/eizIv4/CNJSVTR//tO53J0A==",
+ "requires": {
+ "base64-js": "^1.3.0",
+ "bech32": "^1.1.4",
+ "readonly-date": "^1.0.0"
+ }
+ },
+ "@cosmjs/json-rpc": {
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@cosmjs/json-rpc/-/json-rpc-0.25.5.tgz",
+ "integrity": "sha512-WFDallAolxBqB8V/mYxU0riF/OBoc6Fc2DDsZhds5xOZxeN9sTX0qWhu1UiFyURw4Z9D+SjB9QngqSDBTMTdjw==",
+ "requires": {
+ "@cosmjs/stream": "^0.25.5",
+ "xstream": "^11.14.0"
+ }
+ },
+ "@cosmjs/launchpad": {
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@cosmjs/launchpad/-/launchpad-0.25.5.tgz",
+ "integrity": "sha512-7zsFWQHLAiOUBXV/QWvffI/5Ssma67lEO3V01DZ8CtfnWiO4bCSbnU2sslSAH11RkrPdNfRBM7WOBczMMigIzw==",
+ "requires": {
+ "@cosmjs/amino": "^0.25.5",
+ "@cosmjs/crypto": "^0.25.5",
+ "@cosmjs/encoding": "^0.25.5",
+ "@cosmjs/math": "^0.25.5",
+ "@cosmjs/utils": "^0.25.5",
+ "axios": "^0.21.1",
+ "fast-deep-equal": "^3.1.3"
+ },
+ "dependencies": {
+ "fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+ }
+ }
+ },
+ "@cosmjs/ledger-amino": {
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@cosmjs/ledger-amino/-/ledger-amino-0.25.5.tgz",
+ "integrity": "sha512-Ml9i0NQkJBKChn6hvcr4R8EBp/P6EaCQCO7FOLBMBSazbwqV/F/MtUuNjMNAjPlMrWkFVzJwUq73ZRx+MM6GQw==",
+ "requires": {
+ "@cosmjs/amino": "^0.25.5",
+ "@cosmjs/utils": "^0.25.5",
+ "ledger-cosmos-js": "^2.1.8",
+ "semver": "^7.3.2"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+ "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ }
+ }
+ },
+ "@cosmjs/math": {
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.25.5.tgz",
+ "integrity": "sha512-LWovT1uTHlr+VEce27/14Wrgc4INJYOYk1+ncyvbZertixNFH6OMnc9Xkk0DIV4RYmW+/fvB9kCXVnNtQGSuHg==",
+ "requires": {
+ "bn.js": "^4.11.8"
+ }
+ },
+ "@cosmjs/proto-signing": {
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.25.5.tgz",
+ "integrity": "sha512-YWVp+dGHt7v6ZKjOs8CI9xkpOV49eweHbYMv/vCVYF4cEh0kWwy2WzbWIkUH9zwwUqCxigVOTBYUCfbsjEbfug==",
+ "requires": {
+ "@cosmjs/amino": "^0.25.5",
+ "long": "^4.0.0",
+ "protobufjs": "~6.10.2"
+ }
+ },
+ "@cosmjs/socket": {
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@cosmjs/socket/-/socket-0.25.5.tgz",
+ "integrity": "sha512-wcJVbD4xlF4+5hMum4tOmAy5ppX+E9qrB9Pvt3T7BK+6T5uobxiBQCLEiDwHP3n42RBj+xQWJrScPf5IEWmZKg==",
+ "requires": {
+ "@cosmjs/stream": "^0.25.5",
+ "isomorphic-ws": "^4.0.1",
+ "ws": "^7",
+ "xstream": "^11.14.0"
+ },
+ "dependencies": {
+ "ws": {
+ "version": "7.5.2",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.2.tgz",
+ "integrity": "sha512-lkF7AWRicoB9mAgjeKbGqVUekLnSNO4VjKVnuPHpQeOxZOErX6BPXwJk70nFslRCEEA8EVW7ZjKwXaP9N+1sKQ=="
+ }
+ }
+ },
+ "@cosmjs/stargate": {
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.25.5.tgz",
+ "integrity": "sha512-cOZ+fOC16YT7W2vjBnnk9oJfuIlB02KdK6dn6aigMd4mx+7DS2jvNslpQrfKmtrwB9AVsgc6tklBkYwG5qAuKQ==",
+ "requires": {
+ "@confio/ics23": "^0.6.3",
+ "@cosmjs/amino": "^0.25.5",
+ "@cosmjs/encoding": "^0.25.5",
+ "@cosmjs/math": "^0.25.5",
+ "@cosmjs/proto-signing": "^0.25.5",
+ "@cosmjs/stream": "^0.25.5",
+ "@cosmjs/tendermint-rpc": "^0.25.5",
+ "@cosmjs/utils": "^0.25.5",
+ "long": "^4.0.0",
+ "protobufjs": "~6.10.2"
+ }
+ },
+ "@cosmjs/stream": {
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@cosmjs/stream/-/stream-0.25.5.tgz",
+ "integrity": "sha512-a+0sDNKZTxw9p4j5tl7SI0siMTii7AQot1+5vkH5BkQoAv3C3D8jagPouUz3RUFuh13qftPxPLiHzDFLNSjTnQ==",
+ "requires": {
+ "xstream": "^11.14.0"
+ }
+ },
+ "@cosmjs/tendermint-rpc": {
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.25.5.tgz",
+ "integrity": "sha512-WlUCFVdhbwA3IDA1C858S8WOtLseZLXKTdj5fz1sTKSBmtrig4l1ZMKHHlZRprvmjSpkpbjgSQU+RjjvBd75BA==",
+ "requires": {
+ "@cosmjs/crypto": "^0.25.5",
+ "@cosmjs/encoding": "^0.25.5",
+ "@cosmjs/json-rpc": "^0.25.5",
+ "@cosmjs/math": "^0.25.5",
+ "@cosmjs/socket": "^0.25.5",
+ "@cosmjs/stream": "^0.25.5",
+ "axios": "^0.21.1",
+ "readonly-date": "^1.0.0",
+ "xstream": "^11.14.0"
+ }
+ },
+ "@cosmjs/utils": {
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.25.5.tgz",
+ "integrity": "sha512-U4YdgJadFgXWblthgyXqP28Yw5rsw2IX/cOES0pa6fiB81hoYl2LXqXiuKp2yVPoAgk8JpkFh3i5KchcD9muJg=="
+ },
"@emotion/is-prop-valid": {
"version": "0.7.3",
"resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.7.3.tgz",
@@ -294,6 +476,60 @@
}
}
},
+ "@protobufjs/aspromise": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
+ "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78="
+ },
+ "@protobufjs/base64": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
+ "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="
+ },
+ "@protobufjs/codegen": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
+ "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="
+ },
+ "@protobufjs/eventemitter": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
+ "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A="
+ },
+ "@protobufjs/fetch": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
+ "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=",
+ "requires": {
+ "@protobufjs/aspromise": "^1.1.1",
+ "@protobufjs/inquire": "^1.1.0"
+ }
+ },
+ "@protobufjs/float": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
+ "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E="
+ },
+ "@protobufjs/inquire": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
+ "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik="
+ },
+ "@protobufjs/path": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
+ "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0="
+ },
+ "@protobufjs/pool": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
+ "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q="
+ },
+ "@protobufjs/utf8": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
+ "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA="
+ },
"@types/d3": {
"version": "4.13.12",
"resolved": "https://registry.npmjs.org/@types/d3/-/d3-4.13.12.tgz",
@@ -538,6 +774,11 @@
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.163.tgz",
"integrity": "sha512-BeZM/FZaV53emqyHxn9L39Oz6XbHMBRLA1b1quROku48J/1kYYxPmVOJ/qSQheb81on4BI7H6QDo6bkUuRaDNQ=="
},
+ "@types/long": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz",
+ "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w=="
+ },
"@types/meteor-universe-i18n": {
"version": "1.14.5",
"resolved": "https://registry.npmjs.org/@types/meteor-universe-i18n/-/meteor-universe-i18n-1.14.5.tgz",
@@ -1333,6 +1574,11 @@
"resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz",
"integrity": "sha1-4pf2DX7BAUp6lxo568ipjAtoHnA="
},
+ "base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
+ },
"bech32": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz",
@@ -1351,6 +1597,24 @@
"file-uri-to-path": "1.0.0"
}
},
+ "bip39": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.4.tgz",
+ "integrity": "sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw==",
+ "requires": {
+ "@types/node": "11.11.6",
+ "create-hash": "^1.1.0",
+ "pbkdf2": "^3.0.9",
+ "randombytes": "^2.0.1"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "11.11.6",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz",
+ "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ=="
+ }
+ }
+ },
"bip66": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz",
@@ -3373,6 +3637,14 @@
"resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
"integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="
},
+ "globalthis": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.2.tgz",
+ "integrity": "sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==",
+ "requires": {
+ "define-properties": "^1.1.3"
+ }
+ },
"graceful-fs": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
@@ -3763,6 +4035,11 @@
"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
"integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
},
+ "isomorphic-ws": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz",
+ "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w=="
+ },
"jquery": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz",
@@ -3773,6 +4050,16 @@
"resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz",
"integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA=="
},
+ "js-sha3": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz",
+ "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q=="
+ },
+ "js-sha512": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/js-sha512/-/js-sha512-0.8.0.tgz",
+ "integrity": "sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ=="
+ },
"js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -3962,6 +4249,19 @@
"type-check": "~0.3.2"
}
},
+ "libsodium": {
+ "version": "0.7.9",
+ "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.9.tgz",
+ "integrity": "sha512-gfeADtR4D/CM0oRUviKBViMGXZDgnFdMKMzHsvBdqLBHd9ySi6EtYnmuhHVDDYgYpAO8eU8hEY+F8vIUAPh08A=="
+ },
+ "libsodium-wrappers": {
+ "version": "0.7.9",
+ "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.9.tgz",
+ "integrity": "sha512-9HaAeBGk1nKTRFRHkt7nzxqCvnkWTjn1pdjKgcUnZxj0FyOP4CnhgFhMdrFfgNsukijBGyBLpP2m2uKT1vuWhQ==",
+ "requires": {
+ "libsodium": "^0.7.0"
+ }
+ },
"load-json-file": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
@@ -3999,6 +4299,11 @@
"resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz",
"integrity": "sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o="
},
+ "long": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
+ "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
+ },
"loose-envify": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
@@ -5273,6 +5578,18 @@
"integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
"dev": true
},
+ "pbkdf2": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
+ "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==",
+ "requires": {
+ "create-hash": "^1.1.2",
+ "create-hmac": "^1.1.4",
+ "ripemd160": "^2.0.1",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ }
+ },
"pify": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
@@ -5670,6 +5987,33 @@
"react-is": "^16.8.1"
}
},
+ "protobufjs": {
+ "version": "6.10.2",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.10.2.tgz",
+ "integrity": "sha512-27yj+04uF6ya9l+qfpH187aqEzfCF4+Uit0I9ZBQVqK09hk/SQzKa2MUqUpXaVa7LOFRg1TSSr3lVxGOk6c0SQ==",
+ "requires": {
+ "@protobufjs/aspromise": "^1.1.2",
+ "@protobufjs/base64": "^1.1.2",
+ "@protobufjs/codegen": "^2.0.4",
+ "@protobufjs/eventemitter": "^1.1.0",
+ "@protobufjs/fetch": "^1.1.0",
+ "@protobufjs/float": "^1.0.2",
+ "@protobufjs/inquire": "^1.1.0",
+ "@protobufjs/path": "^1.1.2",
+ "@protobufjs/pool": "^1.1.0",
+ "@protobufjs/utf8": "^1.1.0",
+ "@types/long": "^4.0.1",
+ "@types/node": "^13.7.0",
+ "long": "^4.0.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "13.13.52",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.52.tgz",
+ "integrity": "sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ=="
+ }
+ }
+ },
"pump": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
@@ -5700,6 +6044,14 @@
"resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz",
"integrity": "sha1-H+Bk+wrIUfDeYTIKi/eWg2Qi8z4="
},
+ "randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "requires": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
"react": {
"version": "16.14.0",
"resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz",
@@ -5962,6 +6314,11 @@
"util-deprecate": "^1.0.1"
}
},
+ "readonly-date": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/readonly-date/-/readonly-date-1.0.0.tgz",
+ "integrity": "sha512-tMKIV7hlk0h4mO3JTmmVuIlJVXjKk3Sep9Bf5OH0O+758ruuVkUy2J9SttDLm91IEX/WHlXPSpxMGjPj4beMIQ=="
+ },
"regenerator-runtime": {
"version": "0.13.7",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
@@ -6774,6 +7131,11 @@
"has-flag": "^3.0.0"
}
},
+ "symbol-observable": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-2.0.3.tgz",
+ "integrity": "sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA=="
+ },
"table": {
"version": "5.4.1",
"resolved": "https://registry.npmjs.org/table/-/table-5.4.1.tgz",
@@ -7240,6 +7602,15 @@
"resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz",
"integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw="
},
+ "xstream": {
+ "version": "11.14.0",
+ "resolved": "https://registry.npmjs.org/xstream/-/xstream-11.14.0.tgz",
+ "integrity": "sha512-1bLb+kKKtKPbgTK6i/BaoAn03g47PpFstlbe1BA+y3pNS/LfvcaghS5BFf9+EE1J+KwSQsEpfJvFN5GqFtiNmw==",
+ "requires": {
+ "globalthis": "^1.0.1",
+ "symbol-observable": "^2.0.3"
+ }
+ },
"xtend": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
diff --git a/package.json b/package.json
index 66660a810..00cae80eb 100644
--- a/package.json
+++ b/package.json
@@ -11,6 +11,11 @@
},
"dependencies": {
"@babel/runtime": "^7.13.17",
+ "@cosmjs/launchpad": "^0.25.5",
+ "@cosmjs/ledger-amino": "^0.25.5",
+ "@cosmjs/proto-signing": "^0.25.5",
+ "@cosmjs/stargate": "^0.25.5",
+ "@cosmjs/utils": "^0.25.5",
"@ledgerhq/hw-transport-web-ble": "^5.50.0",
"@ledgerhq/hw-transport-webusb": "^5.53.0",
"@types/meteor-universe-i18n": "^1.14.5",
diff --git a/server/main.js b/server/main.js
index 1ef69d8d8..56737e742 100644
--- a/server/main.js
+++ b/server/main.js
@@ -9,8 +9,8 @@ SYNCING = false;
TXSYNCING = false;
COUNTMISSEDBLOCKS = false;
COUNTMISSEDBLOCKSSTATS = false;
-RPC = Meteor.settings.remote.rpc;
-API = Meteor.settings.remote.api;
+RPC = Meteor.settings.public.remote.rpc;
+API = Meteor.settings.public.remote.api;
timerBlocks = 0;
timerTransactions = 0;