diff --git a/.github/workflows/deploy-wallet-at-pr.yml b/.github/workflows/deploy-wallet-at-pr.yml index ab7a78bc4..9c99eb0b9 100644 --- a/.github/workflows/deploy-wallet-at-pr.yml +++ b/.github/workflows/deploy-wallet-at-pr.yml @@ -125,7 +125,7 @@ jobs: run: rustup target add wasm32-unknown-unknown - name: Install wasm-bindgen-cli - run: cargo install wasm-bindgen-cli@0.2.86 + run: cargo install wasm-bindgen-cli@0.2.87 - name: build the site working-directory: ./apps/namada-interface diff --git a/apps/extension/src/background/approvals/service.ts b/apps/extension/src/background/approvals/service.ts index ef8ff06dd..0927155eb 100644 --- a/apps/extension/src/background/approvals/service.ts +++ b/apps/extension/src/background/approvals/service.ts @@ -5,7 +5,6 @@ import { v4 as uuid } from "uuid"; import BigNumber from "bignumber.js"; import { SubmitTransferMsgSchema, TransferMsgValue } from "@anoma/types"; -import { amountFromMicro } from "@anoma/utils"; import { KVStore } from "@anoma/storage"; import { ExtensionRequester } from "extension"; @@ -19,7 +18,7 @@ export class ApprovalsService { protected readonly keyRingService: KeyRingService, protected readonly chainId: string, protected readonly requester: ExtensionRequester - ) { } + ) {} // Deserialize transfer details and prompt user async approveTransfer(txMsg: string): Promise { @@ -34,7 +33,7 @@ export class ApprovalsService { txMsgBuffer ); const { source, target, token, amount: amountBN } = txDetails; - const amount = amountFromMicro(new BigNumber(amountBN.toString())); + const amount = new BigNumber(amountBN.toString()); const url = `${browser.runtime.getURL( "approvals.html" )}#/tx?id=${id}&source=${source}&target=${target}&token=${token}&amount=${amount}`; diff --git a/apps/extension/src/background/keyring/handler.ts b/apps/extension/src/background/keyring/handler.ts index 6999a7cfd..3705a68d1 100644 --- a/apps/extension/src/background/keyring/handler.ts +++ b/apps/extension/src/background/keyring/handler.ts @@ -300,8 +300,8 @@ const handleTransferCompletedEvent: ( service: KeyRingService ) => InternalHandler = (service) => { return async (_, msg) => { - const { msgId, success } = msg; - return await service.handleTransferCompleted(msgId, success); + const { msgId, success, payload } = msg; + return await service.handleTransferCompleted(msgId, success, payload); }; }; diff --git a/apps/extension/src/background/keyring/messages.ts b/apps/extension/src/background/keyring/messages.ts index ac9afe480..c0bd0ed40 100644 --- a/apps/extension/src/background/keyring/messages.ts +++ b/apps/extension/src/background/keyring/messages.ts @@ -384,7 +384,11 @@ export class TransferCompletedEvent extends Message { return MessageType.TransferCompletedEvent; } - constructor(public readonly success: boolean, public readonly msgId: string) { + constructor( + public readonly success: boolean, + public readonly msgId: string, + public readonly payload?: string + ) { super(); } diff --git a/apps/extension/src/background/keyring/service.ts b/apps/extension/src/background/keyring/service.ts index 3424ee681..558824546 100644 --- a/apps/extension/src/background/keyring/service.ts +++ b/apps/extension/src/background/keyring/service.ts @@ -294,8 +294,14 @@ export class KeyRingService { async handleTransferCompleted( msgId: string, - success: boolean + success: boolean, + payload?: string ): Promise { + if (!success) { + //TODO: pass error message to the TransferStartedEvent and display it in the UI + console.error(payload); + } + const tabs = await syncTabs( this.connectedTabsStore, this.requester, diff --git a/apps/extension/src/background/offscreen/offscreen.ts b/apps/extension/src/background/offscreen/offscreen.ts index 096134653..3068f96f7 100644 --- a/apps/extension/src/background/offscreen/offscreen.ts +++ b/apps/extension/src/background/offscreen/offscreen.ts @@ -33,12 +33,13 @@ const SW_TTL = 20000; const transferCompletedHandler = async ( msgId: string, - success: boolean + success: boolean, + payload?: string ): Promise => { // We are sending the message to the background script await requester.sendMessage( Ports.Background, - new TransferCompletedEvent(success, msgId) + new TransferCompletedEvent(success, msgId, payload) ); // Reducing a number of tracked web workers diff --git a/apps/extension/src/background/web-workers/index.ts b/apps/extension/src/background/web-workers/index.ts index a43330c34..e1f54fe9f 100644 --- a/apps/extension/src/background/web-workers/index.ts +++ b/apps/extension/src/background/web-workers/index.ts @@ -8,17 +8,26 @@ import { export const init = ( data: SubmitTransferMessageData, - transferCompletedHandler: (msgId: string, success: boolean) => Promise + transferCompletedHandler: ( + msgId: string, + success: boolean, + payload?: string + ) => Promise ): void => { const w = new Worker("submit-transfer-web-worker.anoma.js"); w.onmessage = (e: MessageEvent) => { - if (e.data === INIT_MSG) { + const { msgName, payload } = e.data; + if (msgName === INIT_MSG) { w.postMessage(data); - } else if (e.data === TRANSFER_SUCCESSFUL_MSG) { - transferCompletedHandler(data.msgId, true).then(() => w.terminate()); - } else if (e.data === TRANSFER_FAILED_MSG) { - transferCompletedHandler(data.msgId, false).then(() => w.terminate()); + } else if (msgName === TRANSFER_SUCCESSFUL_MSG) { + transferCompletedHandler(data.msgId, true, payload).then(() => + w.terminate() + ); + } else if (msgName === TRANSFER_FAILED_MSG) { + transferCompletedHandler(data.msgId, false, payload).then(() => + w.terminate() + ); } else { console.warn("Not supporeted msg type."); } diff --git a/apps/extension/src/background/web-workers/submit-transfer-web-worker.ts b/apps/extension/src/background/web-workers/submit-transfer-web-worker.ts index b74782de2..2a5b9f5b8 100644 --- a/apps/extension/src/background/web-workers/submit-transfer-web-worker.ts +++ b/apps/extension/src/background/web-workers/submit-transfer-web-worker.ts @@ -36,11 +36,16 @@ import { ({ data }: { data: SubmitTransferMessageData }) => { sdk .submit_transfer(fromBase64(data.txMsg), data.password, data.xsk) - .then(() => postMessage(TRANSFER_SUCCESSFUL_MSG)) - .catch(() => postMessage(TRANSFER_FAILED_MSG)); + .then(() => postMessage({ msgName: TRANSFER_SUCCESSFUL_MSG })) + .catch((error) => { + postMessage({ + msgName: TRANSFER_FAILED_MSG, + payload: error.message, + }); + }); }, false ); - postMessage(INIT_MSG); + postMessage({ msgName: INIT_MSG }); })(); diff --git a/apps/extension/src/background/web-workers/types.ts b/apps/extension/src/background/web-workers/types.ts index ef10b855b..6ec20e5e2 100644 --- a/apps/extension/src/background/web-workers/types.ts +++ b/apps/extension/src/background/web-workers/types.ts @@ -15,7 +15,9 @@ export type SubmitTransferMessageData = { export const INIT_MSG = "init"; export const TRANSFER_SUCCESSFUL_MSG = "transfer-successful"; export const TRANSFER_FAILED_MSG = "transfer-failed"; -export type Msg = +export type MsgName = | typeof INIT_MSG | typeof TRANSFER_FAILED_MSG | typeof TRANSFER_SUCCESSFUL_MSG; + +export type Msg = { msgName: MsgName; payload?: string }; diff --git a/apps/namada-interface/src/slices/StakingAndGovernance/actions.ts b/apps/namada-interface/src/slices/StakingAndGovernance/actions.ts index c9d3eac4a..5e0a83e68 100644 --- a/apps/namada-interface/src/slices/StakingAndGovernance/actions.ts +++ b/apps/namada-interface/src/slices/StakingAndGovernance/actions.ts @@ -2,7 +2,6 @@ import { createAsyncThunk } from "@reduxjs/toolkit"; import BigNumber from "bignumber.js"; import { Query } from "@anoma/shared"; -import { amountToMicro } from "@anoma/utils"; import { Signer, Tokens } from "@anoma/types"; import { chains } from "@anoma/chains"; import { getIntegration } from "@anoma/hooks"; @@ -29,7 +28,7 @@ const toValidator = ([address, votingPower]: [string, string]): Validator => ({ name: address, // TODO: voting power is multiplied by votes_per_token value defined in genesis file // currently it is 10 - votingPower: (new BigNumber(votingPower)).multipliedBy(10).toString(), + votingPower: new BigNumber(votingPower).multipliedBy(10).toString(), homepageUrl: "http://namada.net", commission: "TBD", description: "TBD", @@ -49,8 +48,9 @@ const toMyValidators = ( ...arr.slice(idx + 1), ]; - const stakedAmount = - (new BigNumber(stake)).plus(new BigNumber(v?.stakedAmount || 0)).toString(); + const stakedAmount = new BigNumber(stake) + .plus(new BigNumber(v?.stakedAmount || 0)) + .toString(); return [ ...sliceFn(acc, index), @@ -58,10 +58,7 @@ const toMyValidators = ( uuid: validator, stakingStatus: "Bonded", stakedAmount, - validator: toValidator([ - validator, - stakedAmount, - ]), + validator: toValidator([validator, stakedAmount]), }, ]; }; @@ -167,7 +164,7 @@ export const postNewBonding = createAsyncThunk< await signer.submitBond({ source: change.owner, validator: change.validatorId, - amount: amountToMicro(new BigNumber(change.amount)), + amount: new BigNumber(change.amount), nativeToken: Tokens.NAM.address || "", tx: { token: Tokens.NAM.address || "", @@ -194,7 +191,7 @@ export const postNewUnbonding = createAsyncThunk< await signer.submitUnbond({ source: change.owner, validator: change.validatorId, - amount: amountToMicro(new BigNumber(change.amount)), + amount: new BigNumber(change.amount), tx: { token: Tokens.NAM.address || "", feeAmount: new BigNumber(0), diff --git a/apps/namada-interface/src/slices/transfers.ts b/apps/namada-interface/src/slices/transfers.ts index a98cf4786..75851a928 100644 --- a/apps/namada-interface/src/slices/transfers.ts +++ b/apps/namada-interface/src/slices/transfers.ts @@ -2,7 +2,6 @@ import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; import BigNumber from "bignumber.js"; import { Account, Tokens, TokenType, Signer } from "@anoma/types"; -import { amountToMicro } from "@anoma/utils"; import { getIntegration } from "@anoma/hooks"; import { @@ -166,7 +165,7 @@ export const submitTransferTransaction = createAsyncThunk< source: txTransferArgs.account.address, target: txTransferArgs.target, token: Tokens.NAM.address || "", - amount: amountToMicro(txTransferArgs.amount), + amount: txTransferArgs.amount, nativeToken: Tokens.NAM.address || "", }); } @@ -242,8 +241,7 @@ export const submitBridgeTransferTransaction = createAsyncThunk< source: txBridgeTransferArgs.account.address, target: txBridgeTransferArgs.target, token: txBridgeTransferArgs.token, - // TODO: Check to see if amountToMicro is needed here once implemented for ETH Bridge: - amount: amountToMicro(txBridgeTransferArgs.amount), + amount: txBridgeTransferArgs.amount, }, }); diff --git a/packages/crypto/lib/Cargo.lock b/packages/crypto/lib/Cargo.lock index 1609f6cf8..32d038708 100644 --- a/packages/crypto/lib/Cargo.lock +++ b/packages/crypto/lib/Cargo.lock @@ -1632,9 +1632,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.86" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bba0e8cb82ba49ff4e229459ff22a191bbe9a1cb3a341610c9c33efc27ddf73" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1642,9 +1642,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.86" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b04bc93f9d6bdee709f6bd2118f57dd6679cf1176a1af464fca3ab0d66d8fb" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" dependencies = [ "bumpalo", "log", @@ -1669,9 +1669,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.86" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14d6b024f1a526bb0234f52840389927257beb670610081360e5a03c5df9c258" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1679,9 +1679,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.86" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", @@ -1692,9 +1692,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.86" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" [[package]] name = "wasm-bindgen-test" diff --git a/packages/shared/lib/Cargo.lock b/packages/shared/lib/Cargo.lock index 9ffd04eea..679360e0c 100644 --- a/packages/shared/lib/Cargo.lock +++ b/packages/shared/lib/Cargo.lock @@ -1540,6 +1540,17 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "impl-num-traits" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "951641f13f873bff03d4bf19ae8bec531935ac0ac2cc775f84d7edfdcfed3f17" +dependencies = [ + "integer-sqrt", + "num-traits", + "uint", +] + [[package]] name = "impl-serde" version = "0.4.0" @@ -1604,6 +1615,15 @@ dependencies = [ "web-sys", ] +[[package]] +name = "integer-sqrt" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "276ec31bcb4a9ee45f58bec6f9ec700ae4cf4f4f8f2fa7e06cb406bd5ffdd770" +dependencies = [ + "num-traits", +] + [[package]] name = "io-lifetimes" version = "1.0.10" @@ -1768,7 +1788,7 @@ dependencies = [ [[package]] name = "masp_note_encryption" version = "0.2.0" -source = "git+https://github.com/anoma/masp?rev=cfea8c95d3f73077ca3e25380fd27e5b46e828fd#cfea8c95d3f73077ca3e25380fd27e5b46e828fd" +source = "git+https://github.com/anoma/masp?rev=9320c6b69b5d2e97134866871e960f0a31703813#9320c6b69b5d2e97134866871e960f0a31703813" dependencies = [ "borsh", "chacha20 0.9.1", @@ -1781,7 +1801,7 @@ dependencies = [ [[package]] name = "masp_primitives" version = "0.9.0" -source = "git+https://github.com/anoma/masp?rev=cfea8c95d3f73077ca3e25380fd27e5b46e828fd#cfea8c95d3f73077ca3e25380fd27e5b46e828fd" +source = "git+https://github.com/anoma/masp?rev=9320c6b69b5d2e97134866871e960f0a31703813#9320c6b69b5d2e97134866871e960f0a31703813" dependencies = [ "aes", "bip0039", @@ -1811,7 +1831,7 @@ dependencies = [ [[package]] name = "masp_proofs" version = "0.9.0" -source = "git+https://github.com/anoma/masp?rev=cfea8c95d3f73077ca3e25380fd27e5b46e828fd#cfea8c95d3f73077ca3e25380fd27e5b46e828fd" +source = "git+https://github.com/anoma/masp?rev=9320c6b69b5d2e97134866871e960f0a31703813#9320c6b69b5d2e97134866871e960f0a31703813" dependencies = [ "bellman", "blake2b_simd", @@ -1905,8 +1925,8 @@ checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" [[package]] name = "namada" -version = "0.17.5" -source = "git+https://github.com/anoma/namada#ce6abb08c6ce5c8b2030946097f687411171cb5a" +version = "0.18.0" +source = "git+https://github.com/anoma/namada#c2779df63b226036c345f4ad645664933cd412d0" dependencies = [ "async-std", "async-trait", @@ -1928,8 +1948,6 @@ dependencies = [ "rand 0.8.5", "rand_core 0.6.4", "ripemd", - "rust_decimal", - "rust_decimal_macros", "serde", "serde_json", "sha2 0.9.9", @@ -1947,8 +1965,8 @@ dependencies = [ [[package]] name = "namada_core" -version = "0.17.5" -source = "git+https://github.com/anoma/namada#ce6abb08c6ce5c8b2030946097f687411171cb5a" +version = "0.18.0" +source = "git+https://github.com/anoma/namada#c2779df63b226036c345f4ad645664933cd412d0" dependencies = [ "ark-bls12-381", "ark-ec", @@ -1959,23 +1977,24 @@ dependencies = [ "data-encoding", "derivative", "ed25519-consensus", + "eyre", "ferveo", "ferveo-common", "group-threshold-cryptography", "ibc", "ibc-proto", "ics23", + "impl-num-traits", "index-set", "itertools", "libsecp256k1 0.7.0", "masp_primitives", "namada_macros", + "num-traits", "prost 0.11.9", "prost-types 0.11.9", "rand 0.8.5", "rand_core 0.6.4", - "rust_decimal", - "rust_decimal_macros", "serde", "serde_json", "sha2 0.9.9", @@ -1985,13 +2004,14 @@ dependencies = [ "thiserror", "tonic-build", "tracing", + "uint", "zeroize", ] [[package]] name = "namada_macros" -version = "0.17.5" -source = "git+https://github.com/anoma/namada#ce6abb08c6ce5c8b2030946097f687411171cb5a" +version = "0.18.0" +source = "git+https://github.com/anoma/namada#c2779df63b226036c345f4ad645664933cd412d0" dependencies = [ "proc-macro2", "quote", @@ -2000,16 +2020,14 @@ dependencies = [ [[package]] name = "namada_proof_of_stake" -version = "0.17.5" -source = "git+https://github.com/anoma/namada#ce6abb08c6ce5c8b2030946097f687411171cb5a" +version = "0.18.0" +source = "git+https://github.com/anoma/namada#c2779df63b226036c345f4ad645664933cd412d0" dependencies = [ "borsh", "data-encoding", "derivative", "namada_core", "once_cell", - "rust_decimal", - "rust_decimal_macros", "thiserror", "tracing", ] @@ -2636,28 +2654,6 @@ dependencies = [ "digest 0.10.6", ] -[[package]] -name = "rust_decimal" -version = "1.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee9164faf726e4f3ece4978b25ca877ddc6802fa77f38cdccb32c7f805ecd70c" -dependencies = [ - "arrayvec", - "borsh", - "num-traits", - "serde", -] - -[[package]] -name = "rust_decimal_macros" -version = "1.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4903d8db81d2321699ca8318035d6ff805c548868df435813968795a802171b2" -dependencies = [ - "quote", - "rust_decimal", -] - [[package]] name = "rustc-hash" version = "1.1.0" @@ -2670,7 +2666,7 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" dependencies = [ - "semver", + "semver 0.11.0", ] [[package]] @@ -2792,6 +2788,12 @@ dependencies = [ "semver-parser", ] +[[package]] +name = "semver" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" + [[package]] name = "semver-parser" version = "0.10.2" @@ -3497,9 +3499,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.86" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bba0e8cb82ba49ff4e229459ff22a191bbe9a1cb3a341610c9c33efc27ddf73" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -3507,9 +3509,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.86" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b04bc93f9d6bdee709f6bd2118f57dd6679cf1176a1af464fca3ab0d66d8fb" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" dependencies = [ "bumpalo", "log", @@ -3534,9 +3536,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.86" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14d6b024f1a526bb0234f52840389927257beb670610081360e5a03c5df9c258" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3544,9 +3546,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.86" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", @@ -3557,9 +3559,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.86" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" [[package]] name = "wasm-bindgen-test" @@ -3587,9 +3589,13 @@ dependencies = [ [[package]] name = "wasmparser" -version = "0.83.0" +version = "0.107.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "718ed7c55c2add6548cca3ddd6383d738cd73b892df400e96b9aa876f0141d7a" +checksum = "29e3ac9b780c7dda0cac7a52a5d6d2d6707cc6e3451c9db209b6c758f40d7acb" +dependencies = [ + "indexmap", + "semver 1.0.17", +] [[package]] name = "web-sys" diff --git a/packages/shared/lib/Cargo.toml b/packages/shared/lib/Cargo.toml index 009b7e59b..2c1ee464f 100644 --- a/packages/shared/lib/Cargo.toml +++ b/packages/shared/lib/Cargo.toml @@ -21,9 +21,9 @@ chrono = "0.4.22" getrandom = { version = "0.2.7", features = ["js"] } gloo-utils = { version = "0.1.5", features = ["serde"] } js-sys = "0.3.60" -masp_primitives = { git = "https://github.com/anoma/masp", rev = "cfea8c95d3f73077ca3e25380fd27e5b46e828fd" } -masp_proofs = { git = "https://github.com/anoma/masp", rev = "cfea8c95d3f73077ca3e25380fd27e5b46e828fd", default-features = false, features = ["local-prover"] } -namada = { git = "https://github.com/anoma/namada", version = "0.17.5", default-features = false, features = ["abciplus", "namada-sdk"] } +masp_primitives = { git = "https://github.com/anoma/masp", rev = "9320c6b69b5d2e97134866871e960f0a31703813" } +masp_proofs = { git = "https://github.com/anoma/masp", rev = "9320c6b69b5d2e97134866871e960f0a31703813", default-features = false, features = ["local-prover"] } +namada = { git = "https://github.com/anoma/namada", version = "0.18.0", default-features = false, features = ["abciplus", "namada-sdk"] } prost = "0.9.0" prost-types = "0.9.0" rand = "0.8.5" diff --git a/packages/shared/lib/src/query.rs b/packages/shared/lib/src/query.rs index 26974d658..33bc13187 100644 --- a/packages/shared/lib/src/query.rs +++ b/packages/shared/lib/src/query.rs @@ -4,7 +4,8 @@ use namada::ledger::queries::RPC; use namada::ledger::rpc::get_token_balance; use namada::types::address::Address; use namada::types::masp::ExtendedViewingKey; -use namada::types::token; +use namada::types::token::{self, TokenAddress}; +use namada::types::uint::I256; use std::collections::{HashMap, HashSet}; use std::str::FromStr; use wasm_bindgen::prelude::*; @@ -60,7 +61,7 @@ impl Query { .validator_stake(&self.client, &address, &None) .await?; - result.push((address, total_bonds.unwrap_or(token::Amount::whole(0)))); + result.push((address, total_bonds.unwrap_or(token::Amount::zero()))); } to_js_result(result) @@ -120,13 +121,18 @@ impl Query { to_js_result(result) } - fn get_decoded_balance(decoded_balance: Amount
) -> Vec<(Address, token::Amount)> { + fn get_decoded_balance( + decoded_balance: HashMap, + ) -> Vec<(Address, token::Amount)> { let mut result = Vec::new(); - for (addr, value) in decoded_balance.components() { - let asset_value = token::Amount::from(*value as u64); - result.push((addr.clone(), asset_value)); - } + decoded_balance + .iter() + .into_iter() + .for_each(|(token_address, change)| { + let amount = token::Amount::from_change(*change); + result.push((token_address.address.clone(), amount)); + }); result } @@ -153,7 +159,7 @@ impl Query { for token in tokens { let balances = get_token_balance(&self.client, &token, &owner) .await - .unwrap_or(token::Amount::whole(0)); + .unwrap_or(token::Amount::zero()); result.push((token, balances)); } result @@ -185,6 +191,7 @@ impl Query { .compute_exchanged_balance(&self.client, &viewing_key, epoch) .await .expect("context should contain viewing key"); + let balance = Amount::from(balance); let decoded_balance = shielded.decode_amount(&self.client, balance, epoch).await; Self::get_decoded_balance(decoded_balance) @@ -198,6 +205,10 @@ impl Query { Err(e2) => return Err(JsError::new(&format!("{} {}", e1, e2))), }, }; + let result: Vec<(Address, String)> = result + .into_iter() + .map(|(addr, amount)| (addr, amount.to_string_native())) + .collect(); to_js_result(result) } diff --git a/packages/shared/lib/src/rpc_client.rs b/packages/shared/lib/src/rpc_client.rs index 5ca103dc8..cdf9f0917 100644 --- a/packages/shared/lib/src/rpc_client.rs +++ b/packages/shared/lib/src/rpc_client.rs @@ -1,4 +1,7 @@ use js_sys::JSON::stringify; +use std::fmt::Debug; +use std::fmt::Display; +use thiserror::Error; use wasm_bindgen::prelude::*; use wasm_bindgen::JsCast; use wasm_bindgen_futures::JsFuture; @@ -8,7 +11,7 @@ use namada::ledger::queries::{Client, EncodedResponseQuery}; use namada::tendermint::abci::Code; use namada::tendermint_rpc::{Response as RpcResponse, SimpleRequest}; use namada::types::storage::BlockHeight; -use namada::{tendermint, tendermint_rpc::error::Error as RpcError}; +use namada::{tendermint, tendermint_rpc::error::Error as TendermintRpcError}; #[wasm_bindgen(module = "/src/rpc_client.js")] extern "C" { @@ -16,6 +19,39 @@ extern "C" { async fn wasmFetch(url: JsValue, method: JsValue, body: JsValue) -> Result; } +#[derive(Clone, Error, Debug)] +pub struct RpcError(String); + +impl RpcError { + pub fn new(msg: &str) -> Self { + RpcError(String::from(msg)) + } +} + +impl Display for RpcError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + Display::fmt(&self.0, f) + } +} + +impl From for RpcError { + fn from(error: std::io::Error) -> Self { + RpcError::new(&error.to_string()) + } +} + +impl From for RpcError { + fn from(error: namada::tendermint::Error) -> Self { + RpcError::new(&error.to_string()) + } +} + +impl From for RpcError { + fn from(error: namada::tendermint_rpc::Error) -> Self { + RpcError::new(&error.to_string()) + } +} + pub struct HttpClient { url: String, } @@ -43,7 +79,7 @@ impl HttpClient { impl Client for HttpClient { /// Implementation of the `Client` trait for the `HttpClient` struct. /// It's used by the Sdk to perform queries to the blockchain. - type Error = JsError; + type Error = RpcError; /// Wrapper for tendermint specific abci_query. /// @@ -83,7 +119,7 @@ impl Client for HttpClient { info: response.info, proof: response.proof, }), - Code::Err(code) => Err(JsError::new(&format!("Error code {}", code))), + Code::Err(code) => Err(RpcError::new(&format!("Error code {}", code))), } } @@ -92,7 +128,7 @@ impl Client for HttpClient { /// # Arguments /// /// * `request` - request type to be performed. Check `Client` trait for avaialble requests. - async fn perform(&self, request: R) -> Result + async fn perform(&self, request: R) -> Result where R: SimpleRequest, { @@ -105,7 +141,7 @@ impl Client for HttpClient { let e_str: String = e.into(); // There is no "generic" RpcError, so we have to pick // one with error msg as an argument. - RpcError::server(e_str) + TendermintRpcError::server(e_str) })?; let response_json: String = stringify(&response) .expect("JS object to be serializable") diff --git a/packages/shared/lib/src/sdk/tx.rs b/packages/shared/lib/src/sdk/tx.rs index 7a04ed178..d428f373d 100644 --- a/packages/shared/lib/src/sdk/tx.rs +++ b/packages/shared/lib/src/sdk/tx.rs @@ -3,12 +3,12 @@ use std::{path::PathBuf, str::FromStr}; use borsh::{BorshDeserialize, BorshSerialize}; use namada::{ ibc::core::ics24_host::identifier::{ChannelId, PortId}, - ledger::args, + ledger::args::{self, InputAmount}, types::{ address::Address, chain::ChainId, masp::{ExtendedSpendingKey, PaymentAddress, TransferSource, TransferTarget}, - token::Amount, + token::{Amount, DenominatedAmount, Denomination}, transaction::GasLimit, }, }; @@ -177,7 +177,9 @@ pub fn transfer_tx_args( }?; let native_token = Address::from_str(&native_token)?; let token = Address::from_str(&token)?; - let amount = Amount::from(amount); + let amount_str = amount.to_string(); + let denom_amount = DenominatedAmount::from_str(&amount_str).expect("Amount to be valid."); + let amount = InputAmount::Unvalidated(denom_amount); let args = args::TxTransfer { tx: tx_msg_into_args(tx, password)?, @@ -278,8 +280,15 @@ fn tx_msg_into_args(tx_msg: TxMsg, password: Option) -> Result) -> Result