CashScript / cashscript

⚖️ Easily write and interact with Bitcoin Cash smart contracts
https://cashscript.org
MIT License
115 stars 80 forks source link

UTXO Management #71

Closed nyusternie closed 4 years ago

nyusternie commented 4 years ago

I haven't fully explored this issue, however, I think this is a good example of the problem I'm experiencing, so I'm just gonna place this here to relax while I continue my experimentation:

Transaction details: {
  txid: '9af6b70eb9e94a934128d4696a2345217564253b318439d21bab3982a8fd2205',
  version: 2,
  locktime: 646201,
  vin: [
    {
      txid: 'f23957e7e39e12c64cd465e86448cbb78cd2bf4038e181b5b5696e73b8563796',
      vout: 1,
      sequence: 4294967294,
      n: 0,
      scriptSig: [Object],
      value: 3066,
      legacyAddress: '35e94LPXEsxBJxKCmtVXwpjLtrejJTrZTw',
      cashAddress: 'bitcoincash:pq442d00ml47kmduedh9a8wgznsfy6x7lyhqek2v3e'
    },
    {
      txid: 'fffb77f67b403e8232cb1f1aa53f19fcc5e76831b5383062de3ce144d1fabf69',
      vout: 0,
      sequence: 4294967294,
      n: 1,
      scriptSig: [Object],
      value: 4271,
      legacyAddress: '35e94LPXEsxBJxKCmtVXwpjLtrejJTrZTw',
      cashAddress: 'bitcoincash:pq442d00ml47kmduedh9a8wgznsfy6x7lyhqek2v3e'
    }
  ],
  vout: [
    {
      value: '0.00002901',
      n: 0,
      scriptPubKey: [Object],
      spentTxId: null,
      spentIndex: null,
      spentHeight: null
    },
    {
      value: '0.00003066',
      n: 1,
      scriptPubKey: [Object],
      spentTxId: null,
      spentIndex: null,
      spentHeight: null
    }
  ],
  blockheight: -1,
  confirmations: 0,
  time: 1596146058,
  firstSeenTime: 1596146058,
  valueOut: 0.00005967,
  size: 820,
  valueIn: 0.00007337,
  fees: 0.0000137
}

So the issue above is that I'm attempting to use a UTXO value: 4271 in a contract where the value is sufficient AND exact; however, the SDK is still requesting an additional UTXO value: 3066, only to then send the full UTXO value: '0.00003066' as an output. WHY?

Currently, I have contracts "randomly" failing; and the inconsistency is wearing on my patience 😒 i mean I would ❤️ to get something like Truffle Suite for Bitcoin Cash, but maybe that's a bit much to ask for right now .. or is it??? 🤔

rkalis commented 4 years ago

So the UTXO selection in the SDK is not the most sophisticated, just keeps adding until it's enough, so in this case it first adds the 3066 UTXO, which is not enough, then it adds the 4271 UTXO. I understand that it is important for some contracts to have a different/better UTXO selection, so it is possible to manually provide that for a current lack of better alternative.

const coins = await contractInstance.getUtxos();

// perform your own UTXO selection here
const selectedCoins = ...;

const txid = await contractInstance.functions.xxx(...)
    .from(selectedCoins)
    .to(...)
    .send();

Relevant docs: getUtxos(), from().

nyusternie commented 4 years ago

I've been using getUtxos() and from(), but still getting weird results (read. failures) .. i need to sort out the meep debugger to get a better view on what's happening under the hood 🧐

rkalis commented 4 years ago

Hmm. If you are using from() and you're getting unexpected inputs, then either there's a mistake in your implemented coin selection or there's a bug in the CashScript SDK. Can you provide the code that you're using to select the correct coins before passing them into from()?

nyusternie commented 4 years ago

From my test script:

Recipient address : bitcoincash:qq638hdce3q0pg370hfee7f7sgxkw6j46c9cw9sqer
          pk hash : 3513ddb8cc40f0a23e7dd39cf93e820d676a55d6 

Funder public key : 039784caf46374d1b3b5c568e03536aaceb356174a91f93c5d3c41cc562ec21a51
          pk hash : 55670d530c2feb8a7a2d0bb2d888d6db02e1a1cb
          address : bitcoincash:qp2kwr2npsh7hzn6959m9kyg6mds9cdpevpnss2gu0 

Oracle public key : 0344b28c3daf7c88741c483f068fa4525572587263af3344c631bccf5df6492f12
          pk hash : 4dec2661eb4de14a3b8cda28fb7ca19f0e98cad0
          address : bitcoincash:qpx7cfnpadx7zj3m3ndz37mu5x0saxx26qvtj6u8ds 

Contract address  : bitcoincash:pz6kkjuwhmpspjf6q5ta8g0rq8qqsepzvc5rqn2met
Contract opcount  : 99
Contract bytesize : 240
Contract balance  : 12994
Contract UTXOs    : [
  {
    txid: '62783fbc9abb4d1e4fc364a466f42b397d2bb5aa22b74785939f2111321a46fb',
    vout: 1,
    amount: 0.00000546,
    satoshis: 546,
    height: 646784,
    confirmations: 578
  },
  {
    txid: '2371e424993281e3fcf454f84ed57229246319821dfb92a5afc60ce14d7ec563',
    vout: 1,
    amount: 0.00000546,
    satoshis: 546,
    height: 646427,
    confirmations: 935
  },
  {
    txid: '4cf245fc3ef9e4453419e36a48932c203b79054dec67e5a22d69fa80549c549e',
    vout: 1,
    amount: 0.00000546,
    satoshis: 546,
    height: 646426,
    confirmations: 936
  },
  {
    txid: '3d52ccdd2c189849955fe21da459837afdcd058e17cb6f187f96c63b7811616e',
    vout: 1,
    amount: 0.00000546,
    satoshis: 546,
    height: 646322,
    confirmations: 1040
  },
  {
    txid: '65167884c2ba527e7ad90e67e4519ea452b4d431b45982a8f5928f5fd695cf37',
    vout: 1,
    amount: 0.00001066,
    satoshis: 1066,
    height: 646289,
    confirmations: 1073
  },
  {
    txid: '2bf09d3b9bde998d19b90923ab1fcce485b62880d95449f00147851b53fb47e7',
    vout: 1,
    amount: 0.00001066,
    satoshis: 1066,
    height: 646289,
    confirmations: 1073
  },
  {
    txid: '72efb5bf8e04a730446070eb26d3095064454428ff707a6e4e9f9b3a68448a78',
    vout: 1,
    amount: 0.00001066,
    satoshis: 1066,
    height: 646289,
    confirmations: 1073
  },
  {
    txid: '2a7ab37157095ea693a62088ef3d45822d714f573e11103d3fb71adc502b423e',
    vout: 1,
    amount: 0.00001066,
    satoshis: 1066,
    height: 646286,
    confirmations: 1076
  },
  {
    txid: '2787c13b2ee92ff575c5cb957b4fb46670b49987d7a112bc268de30e7ac6e700',
    vout: 0,
    amount: 0.00004934,
    satoshis: 4934,
    height: 646281,
    confirmations: 1081
  },
  {
    txid: 'b47ea7b307e41f7b94b116b56d73ca3b3ca995f370347f973b8a46f648f06066',
    vout: 1,
    amount: 0.00001066,
    satoshis: 1066,
    height: 646280,
    confirmations: 1082
  },
  {
    txid: '01f42a76da08bbf243da30a30ea59ece4c30984a46c6dbc9b02138751be8881e',
    vout: 0,
    amount: 0.00000546,
    satoshis: 546,
    height: 646279,
    confirmations: 1083
  }
]

FailedRequireError: Transaction failed with reason: mandatory-script-verify-flag-failed (Script evaluated without error but finished with a false/empty top stack element) (code 16)
meep debug --tx=020000000200e7c67a0ee38d26bc12a1d78799b47066b44f7b95cbc575f52fe92e3bc1872700000000fd3b030c39dc090039050000760b000046304402205f33a7c1e25b898114770fef6b7a280accb7e17350a877150c3393b41a34f4e502207ec25fdf84428ac09622359c7e6bedb7ce77f1b696315b47d116bbde4197c5fa4184c7499c45a48d07e10c023fdb60ecc3a9542f61e5ada58e172c7a95dd0a13019a351b6d780588d833ca340da8a79ae4f031d5a28b405d9c899eaf3824bce22441210344b28c3daf7c88741c483f068fa4525572587263af3344c631bccf5df6492f124d8d01020000008e3afe9bb7e177906274645ef63f9e7b44cd4091aa9ff3be7f63654093a1ce0f7ef0ca626bbb058dd443bb78e33b888bdec8295c96e51f5545f96370870c10b900e7c67a0ee38d26bc12a1d78799b47066b44f7b95cbc575f52fe92e3bc1872700000000f00239050333d009210344b28c3daf7c88741c483f068fa4525572587263af3344c631bccf5df6492f121455670d530c2feb8a7a2d0bb2d888d6db02e1a1cb143513ddb8cc40f0a23e7dd39cf93e820d676a55d65579009c63567901697f77820134947f587f547f7701207f755b7a5b796e7c828c7f755d7aa87bbbad5a7a5b795779bb597a567a876300b2756751b275685879547f758176b175567aa2695779547f77547f7581567a9d567a587f778102d007537a8152795880041976a9147e567a7e0288ac7e7c537a947b9458800317a9147e537aa97e01877e7eaa87777767557a519d5579a97b8871ad6d6d5168461300000000000000000000e832f6bcc0970f9c1cff6d5596827f86a39ec98dbba7b7931cff100a00145635c1e0090041000000004cf00239050333d009210344b28c3daf7c88741c483f068fa4525572587263af3344c631bccf5df6492f121455670d530c2feb8a7a2d0bb2d888d6db02e1a1cb143513ddb8cc40f0a23e7dd39cf93e820d676a55d65579009c63567901697f77820134947f587f547f7701207f755b7a5b796e7c828c7f755d7aa87bbbad5a7a5b795779bb597a567a876300b2756751b275685879547f758176b175567aa2695779547f77547f7581567a9d567a587f778102d007537a8152795880041976a9147e567a7e0288ac7e7c537a947b9458800317a9147e537aa97e01877e7eaa87777767557a519d5579a97b8871ad6d6d516800000000fb461a3211219f938547b722aab52b7d392bf466a464c34f1e4dbb9abc3f786201000000fd3b030c39dc090039050000760b000046304402205f33a7c1e25b898114770fef6b7a280accb7e17350a877150c3393b41a34f4e502207ec25fdf84428ac09622359c7e6bedb7ce77f1b696315b47d116bbde4197c5fa41a586f6b1bbe0010acff7cd2fe44fa814418298e8fa62f0a31774c7969db4137a27e0e6a1f55895bc0fbf083ea40f3fc63d6d1101443691db45f01a72fdf028af41210344b28c3daf7c88741c483f068fa4525572587263af3344c631bccf5df6492f124d8d01020000008e3afe9bb7e177906274645ef63f9e7b44cd4091aa9ff3be7f63654093a1ce0f7ef0ca626bbb058dd443bb78e33b888bdec8295c96e51f5545f96370870c10b9fb461a3211219f938547b722aab52b7d392bf466a464c34f1e4dbb9abc3f786201000000f00239050333d009210344b28c3daf7c88741c483f068fa4525572587263af3344c631bccf5df6492f121455670d530c2feb8a7a2d0bb2d888d6db02e1a1cb143513ddb8cc40f0a23e7dd39cf93e820d676a55d65579009c63567901697f77820134947f587f547f7701207f755b7a5b796e7c828c7f755d7aa87bbbad5a7a5b795779bb597a567a876300b2756751b275685879547f758176b175567aa2695779547f77547f7581567a9d567a587f778102d007537a8152795880041976a9147e567a7e0288ac7e7c537a947b9458800317a9147e537aa97e01877e7eaa87777767557a519d5579a97b8871ad6d6d5168220200000000000000000000e832f6bcc0970f9c1cff6d5596827f86a39ec98dbba7b7931cff100a00145635c1e0090041000000004cf00239050333d009210344b28c3daf7c88741c483f068fa4525572587263af3344c631bccf5df6492f121455670d530c2feb8a7a2d0bb2d888d6db02e1a1cb143513ddb8cc40f0a23e7dd39cf93e820d676a55d65579009c63567901697f77820134947f587f547f7701207f755b7a5b796e7c828c7f755d7aa87bbbad5a7a5b795779bb597a567a876300b2756751b275685879547f758176b175567aa2695779547f77547f7581567a9d567a587f778102d007537a8152795880041976a9147e567a7e0288ac7e7c537a947b9458800317a9147e537aa97e01877e7eaa87777767557a519d5579a97b8871ad6d6d51680000000002760b0000000000001976a9143513ddb8cc40f0a23e7dd39cf93e820d676a55d688ac220200000000000017a914b56b4b8ebec300c93a0517d3a1e301c00864226687c1e00900 --idx=0 --amt=4934 --pkscript=a914b56b4b8ebec300c93a0517d3a1e301c00864226687

And here is the JS:

        const tx = await instance.functions
            .payout(oraclePk, new SignatureTemplate(oracle), oracleSig, oracleMsg)
            // .payout(funderPk, new SignatureTemplate(funder), oracleSig, oracleMsg)
            // .from([contractUtxos.find(utxo => utxo.satoshis === 4934), contractUtxos.find(utxo => utxo.satoshis === 1066)])
            .from([contractUtxos.find(utxo => utxo.satoshis === 4934), contractUtxos.find(utxo => utxo.satoshis === 546)])
            // .from([contractUtxos.find(utxo => utxo.satoshis === 6000)])
            // .from([contractUtxos.find(utxo => utxo.satoshis === 5480)])
            // .from([contractUtxos.find(utxo => utxo.satoshis === 4934)])
            .to(recipientAddress, 2934)
            .withHardcodedFee(minerFee) // fee is 2,000 sats
            .withAge(0)
            .send()
            .catch(err => console.error(err))

fyi, my contract currently has a constraint that requires "change", so that's why I'm forced to send 546 as a 2nd output .. so this works with the 6000 UTXO and also with the 5480 UTXO (which is 546 + 4934), but NOT with the 2 separate UTXOs 4934 and 546; so maybe I'm just NOT using from() correctly here??

but what I'd like is to be able to:

  1. select 4934 and 546 UTXOs
  2. have it subtract the 2000 fee
  3. send 2934 to the recipient then 546 back to the contract

fwiw, if I run the above without from(), I receive this:

FailedTransactionError: Transaction failed with reason: undefined
meep debug --tx=02000000086f4e7c43e5421a8d5a074f7324b64942990977c758d1f34abfe527ac78a3b64301000000fd3b030c39dc090039050000760b000046304402205f33a7c1e25b898114770fef6b7a280accb7e17350a877150c3393b41a34f4e502207ec25fdf84428ac09622359c7e6bedb7ce77f1b696315b47d116bbde4197c5fa41efcd8ba8e2c2491a473c553503e9145a12a420db87a9d4e8efd295f7a70b16e6d3883f69de1a86e370c983f5ddaba14750569e6efa846f3d3add1e5e5a37e19a41210344b28c3daf7c88741c483f068fa4525572587263af3344c631bccf5df6492f124d8d010200000071bba45feae6c895b41505447c2edd370b32409c08e2fe50de3cc0ccbe950a0c2b32db6c2c0a6235fb1397e8225ea85e0f0e6e8c7b126d0016ccbde0e667151e6f4e7c43e5421a8d5a074f7324b64942990977c758d1f34abfe527ac78a3b64301000000f00239050333d009210344b28c3daf7c88741c483f068fa4525572587263af3344c631bccf5df6492f121455670d530c2feb8a7a2d0bb2d888d6db02e1a1cb143513ddb8cc40f0a23e7dd39cf93e820d676a55d65579009c63567901697f77820134947f587f547f7701207f755b7a5b796e7c828c7f755d7aa87bbbad5a7a5b795779bb597a567a876300b2756751b275685879547f758176b175567aa2695779547f77547f7581567a9d567a587f778102d007537a8152795880041976a9147e567a7e0288ac7e7c537a947b9458800317a9147e537aa97e01877e7eaa87777767557a519d5579a97b8871ad6d6d5168220200000000000000000000757e6adabc9c607d32de72fe813a1e99d3efe78f100261efa5af22443fde96fbc2e0090041000000004cf00239050333d009210344b28c3daf7c88741c483f068fa4525572587263af3344c631bccf5df6492f121455670d530c2feb8a7a2d0bb2d888d6db02e1a1cb143513ddb8cc40f0a23e7dd39cf93e820d676a55d65579009c63567901697f77820134947f587f547f7701207f755b7a5b796e7c828c7f755d7aa87bbbad5a7a5b795779bb597a567a876300b2756751b275685879547f758176b175567aa2695779547f77547f7581567a9d567a587f778102d007537a8152795880041976a9147e567a7e0288ac7e7c537a947b9458800317a9147e537aa97e01877e7eaa87777767557a519d5579a97b8871ad6d6d516800000000fb461a3211219f938547b722aab52b7d392bf466a464c34f1e4dbb9abc3f786201000000fd3b030c39dc090039050000760b000046304402205f33a7c1e25b898114770fef6b7a280accb7e17350a877150c3393b41a34f4e502207ec25fdf84428ac09622359c7e6bedb7ce77f1b696315b47d116bbde4197c5fa41d7ed9ceb0ad2555bc037199e4dce7ff799768323478def2952f6ce930f3f5e564c606bdc5482373eddea38801e0a81709ca0695faf29f827cde80478950bacb541210344b28c3daf7c88741c483f068fa4525572587263af3344c631bccf5df6492f124d8d010200000071bba45feae6c895b41505447c2edd370b32409c08e2fe50de3cc0ccbe950a0c2b32db6c2c0a6235fb1397e8225ea85e0f0e6e8c7b126d0016ccbde0e667151efb461a3211219f938547b722aab52b7d392bf466a464c34f1e4dbb9abc3f786201000000f00239050333d009210344b28c3daf7c88741c483f068fa4525572587263af3344c631bccf5df6492f121455670d530c2feb8a7a2d0bb2d888d6db02e1a1cb143513ddb8cc40f0a23e7dd39cf93e820d676a55d65579009c63567901697f77820134947f587f547f7701207f755b7a5b796e7c828c7f755d7aa87bbbad5a7a5b795779bb597a567a876300b2756751b275685879547f758176b175567aa2695779547f77547f7581567a9d567a587f778102d007537a8152795880041976a9147e567a7e0288ac7e7c537a947b9458800317a9147e537aa97e01877e7eaa87777767557a519d5579a97b8871ad6d6d5168220200000000000000000000757e6adabc9c607d32de72fe813a1e99d3efe78f100261efa5af22443fde96fbc2e0090041000000004cf00239050333d009210344b28c3daf7c88741c483f068fa4525572587263af3344c631bccf5df6492f121455670d530c2feb8a7a2d0bb2d888d6db02e1a1cb143513ddb8cc40f0a23e7dd39cf93e820d676a55d65579009c63567901697f77820134947f587f547f7701207f755b7a5b796e7c828c7f755d7aa87bbbad5a7a5b795779bb597a567a876300b2756751b275685879547f758176b175567aa2695779547f77547f7581567a9d567a587f778102d007537a8152795880041976a9147e567a7e0288ac7e7c537a947b9458800317a9147e537aa97e01877e7eaa87777767557a519d5579a97b8871ad6d6d51680000000063c57e4de10cc6afa592fb1d821963242972d54ef854f4fce381329924e4712301000000fd3b030c39dc090039050000760b000046304402205f33a7c1e25b898114770fef6b7a280accb7e17350a877150c3393b41a34f4e502207ec25fdf84428ac09622359c7e6bedb7ce77f1b696315b47d116bbde4197c5fa41ce8094b772a6aa460ae4170a1007eedb80dfae0916f45b6ab0b46a8c93e411c844bcbd7dca23f01a391bcba5f09facf89f0bd824b01d730af584bd74df8fd6b141210344b28c3daf7c88741c483f068fa4525572587263af3344c631bccf5df6492f124d8d010200000071bba45feae6c895b41505447c2edd370b32409c08e2fe50de3cc0ccbe950a0c2b32db6c2c0a6235fb1397e8225ea85e0f0e6e8c7b126d0016ccbde0e667151e63c57e4de10cc6afa592fb1d821963242972d54ef854f4fce381329924e4712301000000f00239050333d009210344b28c3daf7c88741c483f068fa4525572587263af3344c631bccf5df6492f121455670d530c2feb8a7a2d0bb2d888d6db02e1a1cb143513ddb8cc40f0a23e7dd39cf93e820d676a55d65579009c63567901697f77820134947f587f547f7701207f755b7a5b796e7c828c7f755d7aa87bbbad5a7a5b795779bb597a567a876300b2756751b275685879547f758176b175567aa2695779547f77547f7581567a9d567a587f778102d007537a8152795880041976a9147e567a7e0288ac7e7c537a947b9458800317a9147e537aa97e01877e7eaa87777767557a519d5579a97b8871ad6d6d5168220200000000000000000000757e6adabc9c607d32de72fe813a1e99d3efe78f100261efa5af22443fde96fbc2e0090041000000004cf00239050333d009210344b28c3daf7c88741c483f068fa4525572587263af3344c631bccf5df6492f121455670d530c2feb8a7a2d0bb2d888d6db02e1a1cb143513ddb8cc40f0a23e7dd39cf93e820d676a55d65579009c63567901697f77820134947f587f547f7701207f755b7a5b796e7c828c7f755d7aa87bbbad5a7a5b795779bb597a567a876300b2756751b275685879547f758176b175567aa2695779547f77547f7581567a9d567a587f778102d007537a8152795880041976a9147e567a7e0288ac7e7c537a947b9458800317a9147e537aa97e01877e7eaa87777767557a519d5579a97b8871ad6d6d5168000000009e549c5480fa692da2e567ec4d05793b202c93486ae3193445e4f93efc45f24c01000000fd3b030c39dc090039050000760b000046304402205f33a7c1e25b898114770fef6b7a280accb7e17350a877150c3393b41a34f4e502207ec25fdf84428ac09622359c7e6bedb7ce77f1b696315b47d116bbde4197c5fa417ec214a44a5e2c9aabe07fdaa2b00b44b8e18ef52fe4afee7039a45465859ddd816869774ddee2ceaf3d20d76d85f51cbf21280798a7bd33fa49bde32f77ebb641210344b28c3daf7c88741c483f068fa4525572587263af3344c631bccf5df6492f124d8d010200000071bba45feae6c895b41505447c2edd370b32409c08e2fe50de3cc0ccbe950a0c2b32db6c2c0a6235fb1397e8225ea85e0f0e6e8c7b126d0016ccbde0e667151e9e549c5480fa692da2e567ec4d05793b202c93486ae3193445e4f93efc45f24c01000000f00239050333d009210344b28c3daf7c88741c483f068fa4525572587263af3344c631bccf5df6492f121455670d530c2feb8a7a2d0bb2d888d6db02e1a1cb143513ddb8cc40f0a23e7dd39cf93e820d676a55d65579009c63567901697f77820134947f587f547f7701207f755b7a5b796e7c828c7f755d7aa87bbbad5a7a5b795779bb597a567a876300b2756751b275685879547f758176b175567aa2695779547f77547f7581567a9d567a587f778102d007537a8152795880041976a9147e567a7e0288ac7e7c537a947b9458800317a9147e537aa97e01877e7eaa87777767557a519d5579a97b8871ad6d6d5168220200000000000000000000757e6adabc9c607d32de72fe813a1e99d3efe78f100261efa5af22443fde96fbc2e0090041000000004cf00239050333d009210344b28c3daf7c88741c483f068fa4525572587263af3344c631bccf5df6492f121455670d530c2feb8a7a2d0bb2d888d6db02e1a1cb143513ddb8cc40f0a23e7dd39cf93e820d676a55d65579009c63567901697f77820134947f587f547f7701207f755b7a5b796e7c828c7f755d7aa87bbbad5a7a5b795779bb597a567a876300b2756751b275685879547f758176b175567aa2695779547f77547f7581567a9d567a587f778102d007537a8152795880041976a9147e567a7e0288ac7e7c537a947b9458800317a9147e537aa97e01877e7eaa87777767557a519d5579a97b8871ad6d6d5168000000006e6111783bc6967f186fcb178e05cdfd7a8359a41de25f954998182cddcc523d01000000fd3b030c39dc090039050000760b000046304402205f33a7c1e25b898114770fef6b7a280accb7e17350a877150c3393b41a34f4e502207ec25fdf84428ac09622359c7e6bedb7ce77f1b696315b47d116bbde4197c5fa4145bb96b003c9d9613b69b087039a82f37aeb7ac6d191749ee3816f18d0aafac6cbbda4cbf078c0d15820502b378491a826c296b0e5b0f31908ecb89e16b8dc0441210344b28c3daf7c88741c483f068fa4525572587263af3344c631bccf5df6492f124d8d010200000071bba45feae6c895b41505447c2edd370b32409c08e2fe50de3cc0ccbe950a0c2b32db6c2c0a6235fb1397e8225ea85e0f0e6e8c7b126d0016ccbde0e667151e6e6111783bc6967f186fcb178e05cdfd7a8359a41de25f954998182cddcc523d01000000f00239050333d009210344b28c3daf7c88741c483f068fa4525572587263af3344c631bccf5df6492f121455670d530c2feb8a7a2d0bb2d888d6db02e1a1cb143513ddb8cc40f0a23e7dd39cf93e820d676a55d65579009c63567901697f77820134947f587f547f7701207f755b7a5b796e7c828c7f755d7aa87bbbad5a7a5b795779bb597a567a876300b2756751b275685879547f758176b175567aa2695779547f77547f7581567a9d567a587f778102d007537a8152795880041976a9147e567a7e0288ac7e7c537a947b9458800317a9147e537aa97e01877e7eaa87777767557a519d5579a97b8871ad6d6d5168220200000000000000000000757e6adabc9c607d32de72fe813a1e99d3efe78f100261efa5af22443fde96fbc2e0090041000000004cf00239050333d009210344b28c3daf7c88741c483f068fa4525572587263af3344c631bccf5df6492f121455670d530c2feb8a7a2d0bb2d888d6db02e1a1cb143513ddb8cc40f0a23e7dd39cf93e820d676a55d65579009c63567901697f77820134947f587f547f7701207f755b7a5b796e7c828c7f755d7aa87bbbad5a7a5b795779bb597a567a876300b2756751b275685879547f758176b175567aa2695779547f77547f7581567a9d567a587f778102d007537a8152795880041976a9147e567a7e0288ac7e7c537a947b9458800317a9147e537aa97e01877e7eaa87777767557a519d5579a97b8871ad6d6d51680000000037cf95d65f8f92f5a88259b431d4b452a49e51e4670ed97a7e52bac28478166501000000fd3b030c39dc090039050000760b000046304402205f33a7c1e25b898114770fef6b7a280accb7e17350a877150c3393b41a34f4e502207ec25fdf84428ac09622359c7e6bedb7ce77f1b696315b47d116bbde4197c5fa4181fd95f5f74382524ad6d8a1d4e97c710d04ec3d628f1a93cf6098de00d3ba10727e41a0c1b30b109c3d6c4f9b710663cd11a5b81ffd27d4d9ff44dfae90a7a641210344b28c3daf7c88741c483f068fa4525572587263af3344c631bccf5df6492f124d8d010200000071bba45feae6c895b41505447c2edd370b32409c08e2fe50de3cc0ccbe950a0c2b32db6c2c0a6235fb1397e8225ea85e0f0e6e8c7b126d0016ccbde0e667151e37cf95d65f8f92f5a88259b431d4b452a49e51e4670ed97a7e52bac28478166501000000f00239050333d009210344b28c3daf7c88741c483f068fa4525572587263af3344c631bccf5df6492f121455670d530c2feb8a7a2d0bb2d888d6db02e1a1cb143513ddb8cc40f0a23e7dd39cf93e820d676a55d65579009c63567901697f77820134947f587f547f7701207f755b7a5b796e7c828c7f755d7aa87bbbad5a7a5b795779bb597a567a876300b2756751b275685879547f758176b175567aa2695779547f77547f7581567a9d567a587f778102d007537a8152795880041976a9147e567a7e0288ac7e7c537a947b9458800317a9147e537aa97e01877e7eaa87777767557a519d5579a97b8871ad6d6d51682a0400000000000000000000757e6adabc9c607d32de72fe813a1e99d3efe78f100261efa5af22443fde96fbc2e0090041000000004cf00239050333d009210344b28c3daf7c88741c483f068fa4525572587263af3344c631bccf5df6492f121455670d530c2feb8a7a2d0bb2d888d6db02e1a1cb143513ddb8cc40f0a23e7dd39cf93e820d676a55d65579009c63567901697f77820134947f587f547f7701207f755b7a5b796e7c828c7f755d7aa87bbbad5a7a5b795779bb597a567a876300b2756751b275685879547f758176b175567aa2695779547f77547f7581567a9d567a587f778102d007537a8152795880041976a9147e567a7e0288ac7e7c537a947b9458800317a9147e537aa97e01877e7eaa87777767557a519d5579a97b8871ad6d6d516800000000e747fb531b854701f04954d98028b685e4cc1fab2309b9198d99de9b3b9df02b01000000fd3b030c39dc090039050000760b000046304402205f33a7c1e25b898114770fef6b7a280accb7e17350a877150c3393b41a34f4e502207ec25fdf84428ac09622359c7e6bedb7ce77f1b696315b47d116bbde4197c5fa418afa28021f16aec73d9ee9af7e89d7b39acd2e8d776b504ab30d144b76955a02d86046782929c9a5bfebf022f32916063ab6eb6667dd61cfd3f1df632f89e07141210344b28c3daf7c88741c483f068fa4525572587263af3344c631bccf5df6492f124d8d010200000071bba45feae6c895b41505447c2edd370b32409c08e2fe50de3cc0ccbe950a0c2b32db6c2c0a6235fb1397e8225ea85e0f0e6e8c7b126d0016ccbde0e667151ee747fb531b854701f04954d98028b685e4cc1fab2309b9198d99de9b3b9df02b01000000f00239050333d009210344b28c3daf7c88741c483f068fa4525572587263af3344c631bccf5df6492f121455670d530c2feb8a7a2d0bb2d888d6db02e1a1cb143513ddb8cc40f0a23e7dd39cf93e820d676a55d65579009c63567901697f77820134947f587f547f7701207f755b7a5b796e7c828c7f755d7aa87bbbad5a7a5b795779bb597a567a876300b2756751b275685879547f758176b175567aa2695779547f77547f7581567a9d567a587f778102d007537a8152795880041976a9147e567a7e0288ac7e7c537a947b9458800317a9147e537aa97e01877e7eaa87777767557a519d5579a97b8871ad6d6d51682a0400000000000000000000757e6adabc9c607d32de72fe813a1e99d3efe78f100261efa5af22443fde96fbc2e0090041000000004cf00239050333d009210344b28c3daf7c88741c483f068fa4525572587263af3344c631bccf5df6492f121455670d530c2feb8a7a2d0bb2d888d6db02e1a1cb143513ddb8cc40f0a23e7dd39cf93e820d676a55d65579009c63567901697f77820134947f587f547f7701207f755b7a5b796e7c828c7f755d7aa87bbbad5a7a5b795779bb597a567a876300b2756751b275685879547f758176b175567aa2695779547f77547f7581567a9d567a587f778102d007537a8152795880041976a9147e567a7e0288ac7e7c537a947b9458800317a9147e537aa97e01877e7eaa87777767557a519d5579a97b8871ad6d6d516800000000788a44683a9b9f4e6e7a70ff284445645009d326eb70604430a7048ebfb5ef7201000000fd3b030c39dc090039050000760b000046304402205f33a7c1e25b898114770fef6b7a280accb7e17350a877150c3393b41a34f4e502207ec25fdf84428ac09622359c7e6bedb7ce77f1b696315b47d116bbde4197c5fa41b7343b2caa11b3d7416840b3807623c63a136a44dd16cf7b41c5c09d07d079247fd074485f3dda7309145beb775dbf9421df84f3bd0231d0c6e7b2ab8147dc6641210344b28c3daf7c88741c483f068fa4525572587263af3344c631bccf5df6492f124d8d010200000071bba45feae6c895b41505447c2edd370b32409c08e2fe50de3cc0ccbe950a0c2b32db6c2c0a6235fb1397e8225ea85e0f0e6e8c7b126d0016ccbde0e667151e788a44683a9b9f4e6e7a70ff284445645009d326eb70604430a7048ebfb5ef7201000000f00239050333d009210344b28c3daf7c88741c483f068fa4525572587263af3344c631bccf5df6492f121455670d530c2feb8a7a2d0bb2d888d6db02e1a1cb143513ddb8cc40f0a23e7dd39cf93e820d676a55d65579009c63567901697f77820134947f587f547f7701207f755b7a5b796e7c828c7f755d7aa87bbbad5a7a5b795779bb597a567a876300b2756751b275685879547f758176b175567aa2695779547f77547f7581567a9d567a587f778102d007537a8152795880041976a9147e567a7e0288ac7e7c537a947b9458800317a9147e537aa97e01877e7eaa87777767557a519d5579a97b8871ad6d6d51682a0400000000000000000000757e6adabc9c607d32de72fe813a1e99d3efe78f100261efa5af22443fde96fbc2e0090041000000004cf00239050333d009210344b28c3daf7c88741c483f068fa4525572587263af3344c631bccf5df6492f121455670d530c2feb8a7a2d0bb2d888d6db02e1a1cb143513ddb8cc40f0a23e7dd39cf93e820d676a55d65579009c63567901697f77820134947f587f547f7701207f755b7a5b796e7c828c7f755d7aa87bbbad5a7a5b795779bb597a567a876300b2756751b275685879547f758176b175567aa2695779547f77547f7581567a9d567a587f778102d007537a8152795880041976a9147e567a7e0288ac7e7c537a947b9458800317a9147e537aa97e01877e7eaa87777767557a519d5579a97b8871ad6d6d51680000000002760b0000000000001976a9143513ddb8cc40f0a23e7dd39cf93e820d676a55d688ace20300000000000017a914b56b4b8ebec300c93a0517d3a1e301c00864226687c2e00900 --idx=0 --amt=546 --pkscript=a914b56b4b8ebec300c93a0517d3a1e301c00864226687
rkalis commented 4 years ago

If I decode the transaction in your "test script" snippet, it has the correct inputs selected (4934, 546). The outputs also look correct (2934, 546), so the UTXO selection is working correctly.

But your tx.hashOutputs check fails at the end of the contract, so there's most likely something going on with the contract implementation. Let's continue this conversation in DM (Twitter?) so we can try debugging it later. Closing the issue for now.