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} -
your available balance:
- ) + + ) break; } return @@ -991,6 +992,7 @@ class ProposalActionButtons extends LedgerButton { {inputs} + {this.state.actionType === 'deposit' ?
your available balance:
: 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;