input-output-hk / js-cardano-wasm

various cardano javascript using wasm bindings
MIT License
31 stars 21 forks source link

{ code: 'InvalidContent', message: 'Invalid witness' } #75

Open rohitsahu21 opened 5 years ago

rohitsahu21 commented 5 years ago

When i submit signed transaction i got error

{ code: 'InvalidContent', message: 'Invalid witness' }``

`const Wallet = require('cardano-wallet'); const axios = require('axios');

(async () => {

const MNEMONICS = "bottom stone xxxx xxxx xxx xxxx tourist finish xxx trend xxx xxxxxx";
let settings = Wallet.BlockchainSettings.mainnet();

let entropy = Wallet.Entropy.from_english_mnemonics(MNEMONICS);
let wallet = Wallet.Bip44RootPrivateKey.recover(entropy);

let account = wallet.bip44_account(Wallet.AccountIndex.new(0 | 0x80000000));
let account_public = account.public();

let chain_prv = account.bip44_chain(false);
let key_prv = chain_prv.address_key(Wallet.AddressKeyIndex.new(0));
// console.log('address public ' + key_prv.to_hex());
let chain_pub = account_public.bip44_chain(false);
let key_pub = chain_pub.address_key(Wallet.AddressKeyIndex.new(0));
// console.log('address public ' + key_pub.to_hex());

let address = key_pub.bootstrap_era_address(settings);

console.log("Address m/bip44/ada/'0/0/0", address.to_base58());

// Building a transaction

let transaction_builder = new Wallet.TransactionBuilder();

let trx = await axios.get('https://cardanoexplorer.com/api/addresses/summary/Ae2tdPwUPEZKfa3EfkEhj9K1jyxUhkuxYaG1SAVFyD3KzrfLBgwaRV11zc1');
// console.log('Inputs:', trx.data.Right.caTxList[0].ctbInputs,'\nOutputs:',trx.data.Right.caTxList[0].ctbOutputs, '\nInputs Total:', trx.data.Right.caTxList[0].ctbInputSum.getCoin/1000000);

console.log(trx.data.Right.caTxList.length)

var trxResult = [];

for (let i = 0; i < trx.data.Right.caTxList.length; i++) {
    // console.log(trx.data.Right.caTxList[i].ctbId);
    trxResult.push(trx.data.Right.caTxList[i].ctbId);
}
// console.log(trxResult);

const inputs = [
    // { pointer: { id: inputResult[2], index: 2 }, value: 1 },
    // { pointer: { id: inputResult[1], index: 1 }, value: 1 },
    { pointer: { id: trxResult[0], index: 0 }, value: 5 }
];
// console.log(inputs);

const outputs = [
    // TODO: you can test the balance by changing the value here.
    { address: "Ae2tdPwUPEZCNHvZbqWhKmeHPxzvZxrnwJZghsm16Vjrzd8DriLn9jCarpr", value: "1000000" }
];

for (let index = 0; index < inputs.length; index++) {
    const pointer = Wallet.TxoPointer.from_json(inputs[index].pointer);
    const value = Wallet.Coin.from(inputs[index].value, 0);
    transaction_builder.add_input(pointer, value);
}

console.log("all inputs set...", transaction_builder.get_input_total().to_str());

for (let index = 0; index < outputs.length; index++) {
    const txout = Wallet.TxOut.from_json(outputs[index]);
    transaction_builder.add_output(txout);
}

console.log("all outputs set...", transaction_builder.get_output_total().to_str());

// verify the balance and the fees:
const fee_algorithm = Wallet.LinearFeeAlgorithm.default();
const balance = transaction_builder.get_balance(fee_algorithm);
if (balance.is_negative()) {
    console.error("not enough inputs, ", balance.value().to_str());
    throw Error("Not enough inputs");
} else {
    if (balance.is_zero()) {
        console.info("Perfect balance no dust", balance.value().to_str());
    } else {
        console.warn("Loosing some coins in extra fees: ", balance.value().to_str());
    }
}

let transaction = transaction_builder.make_transaction();

// console.log("unsigned transaction built", transaction);

let transaction_finalizer = new Wallet.TransactionFinalized(transaction);

// console.log("transaction finalizer built", transaction_finalizer);

for (let index = 0; index < inputs.length; index++) {
    const witness = Wallet.Witness.new_extended_key(
        settings,
        key_prv,
        transaction_finalizer.id()
    );
    transaction_finalizer.add_witness(witness);
    console.log("signature ", index, "added");

}

// at this stage the transaction is ready to be sent
const signed_transaction = transaction_finalizer.finalize();
console.log("ready to send transaction: ", signed_transaction.to_hex());

const result = signed_transaction.to_json()
console.log(result.tx);
// console.log(result.witness);

})();`

Output:-

Address m/bip44/ada/'0/0/0 Ae2tdPwUPEZKfa3EfkEhj9K1jyxUhkuxYaG1SAVFyD3KzrfLBgwaRV11zc1 all inputs set... 5.000000 all outputs set... 1.000000 Loosing some coins in extra fees: 3.834159 signature 0 added ready to send transaction: 82839f8200d818582482582050a89fc4d468c5b25022faa0d01b33ad6551c3f71fee10fe5dd5fcd860a6831900ff9f8282d818582183581c9bf3a0807b668107a9cac1e50e10ada427b7e68835de69f46ad104efa0001adcb4a5531a000f4240ffa0818200d8185885825840d9f10d0ad1e60ca23de9918b7e1cd6b27d3efe564166b428dda5203a076aa83f08a74cb34468ae6b256c71e295d773d79bbd3d6f5b78044652dfb2768744a3bb5840d739b94a8951e95e0524866c44e88991898f16bfd733d23590f7f177f11c23b3097f0993128c3a1273d5864eb7a62b4cc9ff3a33ce0791d66dcada7dd5bda409 { inputs: [ { id: '50a89fc4d468c5b25022faa0d01b33ad6551c3f71fee10fe5dd5fcd860a68319', index: 0 } ], outputs: [ { address: 'Ae2tdPwUPEZCNHvZbqWhKmeHPxzvZxrnwJZghsm16Vjrzd8DriLn9jCarpr', value: 1000000 } ] }

then i push signed transaction on mainnet:

` const axios = require('axios');

const signedBody = { signedTx: Buffer.from('82839f8200d818582482582050a89fc4d468c5b25022faa0d01b33ad6551c3f71fee10fe5dd5fcd860a6831900ff9f8282d818582183581c9bf3a0807b668107a9cac1e50e10ada427b7e68835de69f46ad104efa0001adcb4a5531a000f4240ffa0818200d8185885825840d9f10d0ad1e60ca23de9918b7e1cd6b27d3efe564166b428dda5203a076aa83f08a74cb34468ae6b256c71e295d773d79bbd3d6f5b78044652dfb2768744a3bb5840d739b94a8951e95e0524866c44e88991898f16bfd733d23590f7f177f11c23b3097f0993128c3a1273d5864eb7a62b4cc9ff3a33ce0791d66dcada7dd5bda409', 'hex').toString('base64'), }

// Send a POST request axios({ method: 'post', url: 'https://explorer2.adalite.io/api/v2/txs/signed', data: JSON.stringify(signedBody), headers: { 'Content-Type': 'application/json; charset=utf-8', }, }).then(function (response) { console.log(response); }).catch(function (error) { console.log(error); });`

Give Error:-

data: { code: 'InvalidContent', message: 'Invalid witness' } } }

fei-z commented 4 years ago

Hello, have you solved the problem