From 77826fc77b58c908956290da0b1c738b7ef89987 Mon Sep 17 00:00:00 2001 From: Nebytov Denis Date: Thu, 25 Jan 2024 21:04:36 +0300 Subject: [PATCH] added Cip95BuildSignSubmitCard --- .../cards/cip95BuildSignSubmitCard.js | 103 ++++++++++++++++++ .../tabs/subtabs/cip95AdditionalPart.js | 27 ++++- 2 files changed, 125 insertions(+), 5 deletions(-) create mode 100644 src/components/cards/cip95BuildSignSubmitCard.js diff --git a/src/components/cards/cip95BuildSignSubmitCard.js b/src/components/cards/cip95BuildSignSubmitCard.js new file mode 100644 index 0000000..2f4e556 --- /dev/null +++ b/src/components/cards/cip95BuildSignSubmitCard.js @@ -0,0 +1,103 @@ +import React from 'react' +import { + getAddressFromBech32, + getCslUtxos, + getLargestFirstMultiAsset, + getTransactionFromBytes, + getTransactionOutput, + getTransactionWitnessSetFromBytes, + getTxBuilder, + strToBigNum, + getSignedTransaction, +} from '../../utils/cslTools' +import {bytesToHex} from '../../utils/utils' + +const Cip95BuildSignSubmitCard = (props) => { + const {api, wasm, onWaiting, onError, getters, setters} = props + const {setCertBuilder, setVotingBuilder} = setters + const {certBuilder, votingBuilder, changeAddress, usedAddress, totalRefunds, hexUtxos} = getters + + const buildSignSubmit = () => { + onWaiting(true) + try { + // build Tx + const txBuilder = getTxBuilder(wasm) + // adding certs, votes to the tx + if (certBuilder) { + txBuilder.set_certs_builder(certBuilder) + setCertBuilder(null) + } + if (votingBuilder) { + txBuilder.set_voting_builder(votingBuilder) + setVotingBuilder(null) + } + // gov actions will be here in future + + // Set output and change addresses to those of our wallet + const shelleyOutputAddress = getAddressFromBech32(wasm, usedAddress) + const shelleyChangeAddress = getAddressFromBech32(wasm, changeAddress) + + // Add output of 1 ADA plus total needed for refunds + let outputValue = strToBigNum(wasm, '1000000') + if (totalRefunds.length > 0) { + outputValue = outputValue.checked_add(strToBigNum(wasm, totalRefunds)) + } + + txBuilder.add_output(getTransactionOutput(wasm, shelleyOutputAddress, outputValue)) + // Find the available UTxOs in the wallet and use them as Inputs for the transaction + const wasmUtxos = getCslUtxos(wasm, hexUtxos) + txBuilder.add_inputs_from(wasmUtxos, getLargestFirstMultiAsset(wasm)) + // Set change address, incase too much ADA provided for fee + txBuilder.add_change_if_needed(shelleyChangeAddress) + const wasmUnsignedTransaction = txBuilder.build_tx() + // sign Tx + const unsignedTxHex = bytesToHex(wasmUnsignedTransaction.to_bytes()) + + api + .signTx(unsignedTxHex) + .then((witnessHex) => { + const wasmUnsignedTransaction = getTransactionFromBytes(wasm, unsignedTxHex) + const wasmWitnessSet = getTransactionWitnessSetFromBytes(wasm, witnessHex) + const wasmSignedTransaction = getSignedTransaction(wasm, wasmUnsignedTransaction, wasmWitnessSet) + const signedTxHex = bytesToHex(wasmSignedTransaction.to_bytes()) + + // submit tx + api + .submitTx(signedTxHex) + .then((txId) => { + onWaiting(false) + console.log('The transaction is sent:', txId) + }) + .catch((e) => { + onWaiting(false) + console.log(e) + }) + }) + .catch((e) => { + onWaiting(false) + console.log(e) + }) + + onWaiting(false) + } catch (e) { + console.error(e) + onError() + onWaiting(false) + } + } + + return ( +
+
+ +
+
+ ) +} + +export default Cip95BuildSignSubmitCard diff --git a/src/components/tabs/subtabs/cip95AdditionalPart.js b/src/components/tabs/subtabs/cip95AdditionalPart.js index 020f0b2..3db5c7c 100644 --- a/src/components/tabs/subtabs/cip95AdditionalPart.js +++ b/src/components/tabs/subtabs/cip95AdditionalPart.js @@ -4,6 +4,7 @@ import TabsComponent from '../tabsComponent' import GovBasicFunctionsTab from './govBasicFunctionsTab' import GovActionsTab from './govActionsTab' import ConstitCommCertsTab from './constitCommCertsTab' +import Cip95BuildSignSubmitCard from '../../cards/cip95BuildSignSubmitCard' const Cip95AdditionalPart = ({api, wasm, onWaiting, onError, getters, setters}) => { const [certsInTx, setCertsInTx] = useState([]) @@ -42,7 +43,14 @@ const Cip95AdditionalPart = ({api, wasm, onWaiting, onError, getters, setters}) return getCslVotingBuilder(wasm) } - const newGetters = Object.assign(getters, {certsInTx, votesInTx, getCertBuilder, getVotingBuilder}) + const newGetters = Object.assign(getters, { + certsInTx, + votesInTx, + getCertBuilder, + getVotingBuilder, + certBuilder, + votingBuilder, + }) const newSetters = Object.assign(setters, { handleAddingCertInTx, handleAddingVotesInTx, @@ -77,10 +85,19 @@ const Cip95AdditionalPart = ({api, wasm, onWaiting, onError, getters, setters}) }, ] return ( -
- -
- // The button "Build, Sign, Submit" should be here + <> + +
+ +
+ ) }