Emurgo / cardano-serialization-lib

This is a library, written in Rust, for serialization & deserialization of data structures used in Cardano's Haskell implementation of Alonzo along with useful utility functions.
Other
230 stars 124 forks source link

`add_change_if_needed` multiple change outputs on many assets causes Error from node `OutputTooSmallUTxO` #664

Open 0xtrossets opened 5 months ago

0xtrossets commented 5 months ago

When I have a lot of assets in the inputs and have them all directed to the change using add_change_if_needed, the Transaction Builder generates multiple change outputs (to reduce output overflow), but on submitting the transaction, the node complains that one of the change outputs is too small with an Error OutputTooSmallUTxO

recreate:

  1. generate transaction with
    1. inputs that total to many separate assets (about 250 different asset names)
    2. single small output of just ADA (no assets)
  2. use add_change_if_needed to generate the change outputs
  3. attempt to submit the transaction to the node
0xtrossets commented 5 months ago

I feel like the calculation somewhere around here is causing the overflow?

https://github.com/Emurgo/cardano-serialization-lib/blob/master/rust/src/tx_builder.rs#L1439 https://github.com/Emurgo/cardano-serialization-lib/blob/master/rust/src/tx_builder.rs#L1520

0xtrossets commented 5 months ago

Here's an example transaction's outputs. The first output was designated by me, the last two are change outputs generated by calling add_change_if_needed. The first change output is the one the node will throw the OutputTooSmallUTxO error on.

[
      {
        "address": "addr_test1vruxgcu6jecuudsqwx78ke9fg7d8ratxt3jc5kp9ezz6wyg64vcsh",
        "amount": {
          "coin": "19121212",
          "multiasset": null
        },
        "plutus_data": null,
        "script_ref": null
      },
      {
        "address": "addr_test1qzt3mkqds48jtyfqm02hpxz374hm84v569z64z5zj5yzmf2mtzhs9zlu6hpft8x4znfgcuw7ns5p0rfkcrc47dhwdr3s7c7lyv",
        "amount": {
          "coin": "22450790",
          "multiasset": {
            "bdf769909ff91fc277bb86a68e083c00c8fa2b3d2a49086115fa5bde": {
              "436f6f6c4e46543134636136646633632d64": "1",
              "436f6f6c4e46543165356632616330312d63": "1",
              "436f6f6c4e46543166653065383832332d61": "1",
              "436f6f6c4e46543237386233393630662d33": "1",
              "436f6f6c4e46543263313462363633342d35": "1",
              "436f6f6c4e46543264636663633434622d65": "1",
              "436f6f6c4e46543330326635383831612d34": "1",
              "436f6f6c4e46543332656639323038662d36": "1",
              "436f6f6c4e46543361633065396462342d33": "1",
              "436f6f6c4e46543463316164653161352d38": "1",
              "436f6f6c4e46543465643934663136612d37": "1",
              "436f6f6c4e46543466363066393837332d33": "1",
              "436f6f6c4e46543530333665643237362d37": "1",
              "436f6f6c4e46543561373561313332642d37": "1",
              "436f6f6c4e46543563643834626536332d37": "1",
              "436f6f6c4e46543635633638393532392d36": "1",
              "436f6f6c4e46543661303564663861622d34": "1",
              "436f6f6c4e46543664643135353761362d62": "1",
              "436f6f6c4e46543733663132353832372d63": "1",
              "436f6f6c4e46543762393834643139392d30": "1",
              "436f6f6c4e46543763353734353064392d32": "1",
              "436f6f6c4e46543831646635393562342d64": "1",
              "436f6f6c4e46543833353366313837382d32": "1",
              "436f6f6c4e46543836646636326435332d62": "1",
              "436f6f6c4e46543936363034623566372d61": "1",
              "436f6f6c4e46543963343239383364342d32": "1",
              "436f6f6c4e46543963383838643063322d36": "1",
              "436f6f6c4e4654313030343633636632332d35": "1",
              "436f6f6c4e4654313061353333393934632d39": "1",
              "436f6f6c4e4654313066643638343533382d37": "1",
              "436f6f6c4e4654313137393539363739392d36": "1",
              "436f6f6c4e4654313164613665623436392d35": "1",
              "436f6f6c4e4654313166383534313765302d32": "1",
              "436f6f6c4e4654313231323732623433362d64": "1",
              "436f6f6c4e4654313263636335326366392d32": "1",
              "436f6f6c4e4654313266376332633366392d61": "1",
              "436f6f6c4e4654313333323062626365662d63": "1",
              "436f6f6c4e4654313339653166616266392d65": "1",
              "436f6f6c4e4654313361636631353931642d37": "1",
              "436f6f6c4e4654313431373135373534612d30": "1",
              "436f6f6c4e4654313461623364373637642d64": "1",
              "436f6f6c4e4654313465383434653634312d30": "1",
              "436f6f6c4e4654313532373065323033352d31": "1",
              "436f6f6c4e4654313561386339353330382d30": "1",
              "436f6f6c4e4654313566306234323165622d33": "1",
              "436f6f6c4e4654313632386464373930342d66": "1",
              "436f6f6c4e4654313634663633383464352d32": "1",
              "436f6f6c4e4654313663313766653562632d33": "1",
              "436f6f6c4e4654313736323237636537322d35": "1",
              "436f6f6c4e4654313736653362663939332d37": "1",
              "436f6f6c4e4654313764633039306337302d37": "1",
              "436f6f6c4e4654313831346538396330642d38": "1",
              "436f6f6c4e4654313832326133616231342d32": "1",
              "436f6f6c4e4654313864633766366334302d64": "1",
              "436f6f6c4e4654313933333337646136612d65": "1",
              "436f6f6c4e4654313964333962323037342d36": "1",
              "436f6f6c4e4654313965633236623130392d39": "1",
              "436f6f6c4e4654323033313631383133352d65": "1",
              "436f6f6c4e4654323062666230346233642d30": "1",
              "436f6f6c4e4654323063323837313861322d36": "1",
              "436f6f6c4e4654323130643265383534372d66": "1",
              "436f6f6c4e4654323133343936316337652d65": "1",
              "436f6f6c4e4654323136656661386564652d39": "1",
              "436f6f6c4e4654323232316237626639652d64": "1",
              "436f6f6c4e4654323235663062353931372d37": "1",
              "436f6f6c4e4654323262393634313733382d61": "1",
              "436f6f6c4e4654323334633261343039312d64": "1",
              "436f6f6c4e4654323362333065356265382d36": "1",
              "436f6f6c4e4654323363396230353130342d37": "1",
              "436f6f6c4e4654323430623030653432622d32": "1",
              "436f6f6c4e4654323436643164346462302d62": "1",
              "436f6f6c4e4654323437306236336264622d36": "1",
              "436f6f6c4e4654323537653562306334322d66": "1",
              "436f6f6c4e4654323564393763316564362d38": "1",
              "436f6f6c4e4654323565373061376433392d39": "1",
              "436f6f6c4e4654323637316437303863312d39": "1",
              "436f6f6c4e4654323663646233613430372d65": "1",
              "436f6f6c4e4654323664373330323762392d64": "1",
              "436f6f6c4e4654323730393765666534622d65": "1",
              "436f6f6c4e4654323737613735343238332d65": "1",
              "436f6f6c4e4654323762643235373034302d33": "1",
              "436f6f6c4e4654323837343531313731612d34": "1",
              "436f6f6c4e4654323861366664363530632d62": "1",
              "436f6f6c4e4654323866646531616239632d36": "1",
              "436f6f6c4e4654323930313265336232622d64": "1",
              "436f6f6c4e4654323933646231376536632d37": "1",
              "436f6f6c4e4654323964633937613437322d39": "1",
              "436f6f6c4e4654333032643636353538652d33": "1",
              "436f6f6c4e4654333066323261636161392d39": "1",
              "436f6f6c4e4654333066656335336535332d64": "1",
              "436f6f6c4e4654333131313634666635612d34": "1",
              "436f6f6c4e4654333132666232306634362d64": "1",
              "436f6f6c4e4654333164396261383565652d35": "1",
              "436f6f6c4e4654333236646536656165342d30": "1",
              "436f6f6c4e4654333265396235656665342d31": "1",
              "436f6f6c4e4654333265643439633563362d63": "1",
              "436f6f6c4e4654333332646537303464642d37": "1",
              "436f6f6c4e4654333332656464613534322d33": "1",
              "436f6f6c4e4654333334633932623533352d64": "1",
              "436f6f6c4e4654333434323535353638662d61": "1",
              "436f6f6c4e4654333464316137343333392d61": "1",
              "436f6f6c4e4654333466633863363962392d39": "1",
              "436f6f6c4e4654333530393333313230372d62": "1",
              "436f6f6c4e4654333535333764353634642d33": "1",
              "436f6f6c4e4654333536386530633763662d66": "1",
              "436f6f6c4e4654333635616431303766302d61": "1",
              "436f6f6c4e4654333639373736386138662d61": "1",
              "436f6f6c4e4654333662313061626130612d64": "1",
              "436f6f6c4e4654333733353033316533302d39": "1",
              "436f6f6c4e4654333735656562386632382d39": "1",
              "436f6f6c4e4654333738373035393561642d63": "1",
              "436f6f6c4e4654333834313562323166392d34": "1",
              "436f6f6c4e4654333834376365626130362d34": "1",
              "436f6f6c4e4654333864343939333563632d32": "1",
              "436f6f6c4e4654333931653962656361612d33": "1",
              "436f6f6c4e4654333935626430356538622d63": "1",
              "436f6f6c4e4654333962343438353462382d39": "1",
              "436f6f6c4e4654343033306561376234632d39": "1",
              "436f6f6c4e4654343036646339636164642d62": "1",
              "436f6f6c4e4654343062366439373166352d39": "1",
              "436f6f6c4e4654343138333162356239652d36": "1",
              "436f6f6c4e4654343138616635313139652d33": "1",
              "436f6f6c4e4654343166353166633866622d34": "1",
              "436f6f6c4e4654343232396236356433652d34": "1",
              "436f6f6c4e4654343235396439663531342d34": "1",
              "436f6f6c4e4654343263616363363563662d63": "1",
              "436f6f6c4e4654343330323463383738312d33": "1",
              "436f6f6c4e4654343334656136663737642d35": "1",
              "436f6f6c4e4654343336343537303537642d64": "1",
              "436f6f6c4e4654343430356232306537332d37": "1",
              "436f6f6c4e4654343434333137623836302d32": "1",
              "436f6f6c4e4654343464613463356634622d33": "1",
              "436f6f6c4e4654343532393930616233652d66": "1",
              "436f6f6c4e4654343534396137363037652d30": "1",
              "436f6f6c4e4654343563623635666663372d65": "1",
              "436f6f6c4e4654343630346365386334372d36": "1",
              "436f6f6c4e4654343633626331386666642d31": "1",
              "436f6f6c4e4654343661333836303333332d39": "1",
              "436f6f6c4e4654343731663236663639352d38": "1",
              "436f6f6c4e4654343738653431313566622d33": "1",
              "436f6f6c4e4654343739653134316365652d64": "1",
              "436f6f6c4e4654343831386534613033352d63": "1",
              "436f6f6c4e4654343833383738633430342d66": "1",
              "436f6f6c4e4654343834653037323133652d37": "1",
              "436f6f6c4e4654343931663730373933362d31": "1",
              "436f6f6c4e4654343939306561643739352d31": "1",
              "436f6f6c4e4654343965353461396432312d35": "1",
              "436f6f6c4e4654353030646630636466632d31": "1",
              "436f6f6c4e4654353039313836643430312d62": "1",
              "436f6f6c4e4654353066353438623763332d61": "1",
              "436f6f6c4e4654353136616334656539632d30": "1",
              "436f6f6c4e4654353138383764633837312d38": "1",
              "436f6f6c4e4654353166613235636538392d35": "1",
              "436f6f6c4e4654353232336337383265642d63": "1",
              "436f6f6c4e4654353237346639323966362d34": "1",
              "436f6f6c4e4654353263316361363330352d34": "1",
              "436f6f6c4e4654353330623033373464352d36": "1",
              "436f6f6c4e4654353364356538383732352d38": "1",
              "436f6f6c4e4654353365353661366666642d38": "1",
              "436f6f6c4e4654353433303766643438352d61": "1",
              "436f6f6c4e4654353435366166393536332d33": "1",
              "436f6f6c4e4654353439643763323862302d62": "1",
              "436f6f6c4e4654353537306633656266332d31": "1",
              "436f6f6c4e4654353537353435653665362d63": "1",
              "436f6f6c4e4654353563666438363961612d35": "1",
              "436f6f6c4e4654353632333734666634302d37": "1",
              "436f6f6c4e4654353633653666366665382d39": "1",
              "436f6f6c4e4654353635343637383565612d34": "1",
              "436f6f6c4e4654353733346134623332352d62": "1",
              "436f6f6c4e4654353735366338336530642d61": "1",
              "436f6f6c4e4654353738366235393865612d30": "1",
              "436f6f6c4e4654353834616162396438662d36": "1",
              "436f6f6c4e4654353861333061383134652d30": "1",
              "436f6f6c4e4654353864393130353532652d32": "1",
              "436f6f6c4e4654353936303535336534652d37": "1",
              "436f6f6c4e4654353939393863376432652d34": "1",
              "436f6f6c4e4654353961653830393834382d61": "1",
              "436f6f6c4e4654363032336436666436392d36": "1",
              "436f6f6c4e4654363033326566363335362d63": "1",
              "436f6f6c4e4654363061633032366437382d35": "1",
              "436f6f6c4e4654363132663235393238322d32": "1",
              "436f6f6c4e4654363138366434326662382d31": "1",
              "436f6f6c4e4654363164616338393066342d35": "1",
              "436f6f6c4e4654363233336366316564622d65": "1",
              "436f6f6c4e4654363234386535343839622d64": "1",
              "436f6f6c4e4654363266613964383665642d34": "1",
              "436f6f6c4e4654363337336230666563362d66": "1",
              "436f6f6c4e4654363337353937613462632d37": "1",
              "436f6f6c4e4654363362363465346666372d66": "1",
              "436f6f6c4e4654363432613539626565622d66": "1",
              "436f6f6c4e4654363439316365613631312d35": "1",
              "436f6f6c4e4654363463656531313033612d30": "1",
              "436f6f6c4e4654363534396666343237302d63": "1",
              "436f6f6c4e4654363562633430366237662d34": "1",
              "436f6f6c4e4654363563343066386164332d66": "1",
              "436f6f6c4e4654363637326333373433652d66": "1",
              "436f6f6c4e4654363639613935373264392d31": "1",
              "436f6f6c4e4654363661636261306161612d34": "1",
              "436f6f6c4e4654363733343463313533362d35": "1",
              "436f6f6c4e4654363762343537373337632d31": "1",
              "436f6f6c4e4654363766333931326231642d66": "1",
              "436f6f6c4e4654363832303730346330652d61": "1",
              "436f6f6c4e4654363866363335666461372d39": "1",
              "436f6f6c4e4654363866393563636563632d36": "1",
              "436f6f6c4e4654363961316561373765332d33": "1",
              "436f6f6c4e4654363965366562386333622d61": "1",
              "436f6f6c4e4654363966353435313238652d36": "1",
              "436f6f6c4e4654373030633164656633342d36": "1",
              "436f6f6c4e4654373033393434326261382d66": "1",
              "436f6f6c4e4654373038323766623630662d38": "1",
              "436f6f6c4e4654373163623932633131352d64": "1",
              "436f6f6c4e4654373164363636326333612d62": "1",
              "436f6f6c4e4654373165356339303631352d34": "1",
              "436f6f6c4e4654373232333530363366352d66": "1",
              "436f6f6c4e4654373235646139313130302d64": "1",
              "436f6f6c4e4654373264656632636332382d63": "1",
              "436f6f6c4e4654373331366135306337302d32": "1",
              "436f6f6c4e4654373338366264343930322d61": "1",
              "436f6f6c4e4654373338383234303766622d31": "1",
              "436f6f6c4e4654373431343166313164352d63": "1",
              "436f6f6c4e4654373436633363366536382d33": "1",
              "436f6f6c4e4654373463306131303337332d64": "1",
              "436f6f6c4e4654373538383633363630332d35": "1",
              "436f6f6c4e4654373564653065393733392d31": "1",
              "436f6f6c4e4654373566623930616666662d33": "1",
              "436f6f6c4e4654373630373335643031322d32": "1",
              "436f6f6c4e4654373635666362363737612d38": "1",
              "436f6f6c4e4654373636336430643134342d63": "1",
              "436f6f6c4e4654373735336435613765652d65": "1",
              "436f6f6c4e4654373761343763353839632d37": "1",
              "436f6f6c4e4654373761613939323434392d65": "1",
              "436f6f6c4e4654373833316238333031642d63": "1",
              "436f6f6c4e4654373837343438626334662d31": "1",
              "436f6f6c4e4654373866343230623130352d33": "1",
              "436f6f6c4e4654373931336335393564652d38": "1",
              "436f6f6c4e4654373936643262383061382d38": "1",
              "436f6f6c4e4654373963663164643064622d35": "1"
            }
          }
        },
        "plutus_data": null,
        "script_ref": null
      },
      {
        "address": "addr_test1qzt3mkqds48jtyfqm02hpxz374hm84v569z64z5zj5yzmf2mtzhs9zlu6hpft8x4znfgcuw7ns5p0rfkcrc47dhwdr3s7c7lyv",
        "amount": {
          "coin": "558017593",
          "multiasset": {
            "bdf769909ff91fc277bb86a68e083c00c8fa2b3d2a49086115fa5bde": {
              "436f6f6c4e4654383037653965353530362d34": "1",
              "436f6f6c4e4654383038336536386438632d36": "1",
              "436f6f6c4e4654383065316632333363302d35": "1",
              "436f6f6c4e4654383133316639366166332d64": "1",
              "436f6f6c4e4654383136306133303265372d37": "1",
              "436f6f6c4e4654383137326162333366352d35": "1",
              "436f6f6c4e4654383231366637336536382d65": "1",
              "436f6f6c4e4654383233326434616234652d66": "1",
              "436f6f6c4e4654383234306136623339372d31": "1",
              "436f6f6c4e4654383339316161653235652d65": "1",
              "436f6f6c4e4654383361313361613935612d37": "1",
              "436f6f6c4e4654383363623463373732632d63": "1",
              "436f6f6c4e4654383431356263333434642d37": "1",
              "436f6f6c4e4654383434643664366131382d37": "1",
              "436f6f6c4e4654383436323632616137352d61": "1",
              "436f6f6c4e4654383535383430363833382d38": "1",
              "436f6f6c4e4654383537396163376333372d30": "1",
              "436f6f6c4e4654383562663534633635312d30": "1"
            }
          }
        },
        "plutus_data": null,
        "script_ref": null
      }
]
lisicky commented 5 months ago

Hi @0xtrossets! Thanks , it is interesting issue we will investigate it