<s> import bitcoin . core <EOL> import bitcoin . core . script <EOL> import openassets . protocol <EOL> import openassets . transactions <EOL> import unittest <EOL> import unittest . mock <EOL> class TransactionBuilderTests ( unittest . TestCase ) : <EOL> def setUp ( self ) : <EOL> self . target = openassets . transactions . TransactionBuilder ( <NUM_LIT:10> ) <EOL> def test_issue_asset_success ( self ) : <EOL> outputs = self . generate_outputs ( [ <EOL> ( <NUM_LIT:20> , b'<STR_LIT:source>' , b'<STR_LIT>' , <NUM_LIT:50> ) , <EOL> ( <NUM_LIT:15> , b'<STR_LIT:source>' , None , <NUM_LIT:0> ) , <EOL> ( <NUM_LIT:10> , b'<STR_LIT:source>' , None , <NUM_LIT:0> ) <EOL> ] ) <EOL> spec = openassets . transactions . TransferParameters ( outputs , b'<STR_LIT:target>' , b'<STR_LIT>' , <NUM_LIT:1000> ) <EOL> result = self . target . issue ( spec , b'<STR_LIT>' , <NUM_LIT:5> ) <EOL> self . assertEqual ( <NUM_LIT:2> , len ( result . vin ) ) <EOL> self . assert_input ( result . vin [ <NUM_LIT:0> ] , b'<STR_LIT:1>' * <NUM_LIT:32> , <NUM_LIT:1> , b'<STR_LIT:source>' ) <EOL> self . assert_input ( result . vin [ <NUM_LIT:1> ] , b'<STR_LIT:2>' * <NUM_LIT:32> , <NUM_LIT:2> , b'<STR_LIT:source>' ) <EOL> self . assertEqual ( <NUM_LIT:3> , len ( result . vout ) ) <EOL> self . assert_output ( result . vout [ <NUM_LIT:0> ] , <NUM_LIT:10> , b'<STR_LIT:target>' ) <EOL> self . assert_marker ( result . vout [ <NUM_LIT:1> ] , [ <NUM_LIT:1000> ] , b'<STR_LIT>' ) <EOL> self . assert_output ( result . vout [ <NUM_LIT:2> ] , <NUM_LIT:10> , b'<STR_LIT>' ) <EOL> def test_issue_asset_insufficient_funds ( self ) : <EOL> outputs = self . generate_outputs ( [ <EOL> ( <NUM_LIT:20> , b'<STR_LIT:source>' , b'<STR_LIT>' , <NUM_LIT:50> ) , <EOL> ( <NUM_LIT:15> , b'<STR_LIT:source>' , None , <NUM_LIT:0> ) , <EOL> ( <NUM_LIT:5> , b'<STR_LIT:source>' , None , <NUM_LIT:0> ) <EOL> ] ) <EOL> spec = openassets . transactions . TransferParameters ( outputs , b'<STR_LIT:target>' , b'<STR_LIT>' , <NUM_LIT:1000> ) <EOL> self . assertRaises ( <EOL> openassets . transactions . InsufficientFundsError , <EOL> self . target . issue , spec , b'<STR_LIT>' , <NUM_LIT:5> ) <EOL> def test_transfer_bitcoin_with_change ( self ) : <EOL> outputs = self . generate_outputs ( [ <EOL> ( <NUM_LIT> , b'<STR_LIT:source>' , b'<STR_LIT>' , <NUM_LIT:50> ) , <EOL> ( <NUM_LIT> , b'<STR_LIT:source>' , None , <NUM_LIT:0> ) , <EOL> ( <NUM_LIT> , b'<STR_LIT:source>' , None , <NUM_LIT:0> ) <EOL> ] ) <EOL> spec = openassets . transactions . TransferParameters ( outputs , b'<STR_LIT:target>' , b'<STR_LIT>' , <NUM_LIT:200> ) <EOL> result = self . target . transfer_bitcoin ( spec , <NUM_LIT:10> ) <EOL> self . assertEqual ( <NUM_LIT:2> , len ( result . vin ) ) <EOL> self . assert_input ( result . vin [ <NUM_LIT:0> ] , b'<STR_LIT:1>' * <NUM_LIT:32> , <NUM_LIT:1> , b'<STR_LIT:source>' ) <EOL> self . assert_input ( result . vin [ <NUM_LIT:1> ] , b'<STR_LIT:2>' * <NUM_LIT:32> , <NUM_LIT:2> , b'<STR_LIT:source>' ) <EOL> self . assertEqual ( <NUM_LIT:2> , len ( result . vout ) ) <EOL> self . assert_output ( result . vout [ <NUM_LIT:0> ] , <NUM_LIT> , b'<STR_LIT>' ) <EOL> self . assert_output ( result . vout [ <NUM_LIT:1> ] , <NUM_LIT:200> , b'<STR_LIT:target>' ) <EOL> def test_transfer_bitcoin_no_change ( self ) : <EOL> outputs = self . generate_outputs ( [ <EOL> ( <NUM_LIT> , b'<STR_LIT:source>' , b'<STR_LIT>' , <NUM_LIT:50> ) , <EOL> ( <NUM_LIT> , b'<STR_LIT:source>' , None , <NUM_LIT:0> ) , <EOL> ( <NUM_LIT> , b'<STR_LIT:source>' , None , <NUM_LIT:0> ) <EOL> ] ) <EOL> spec = openassets . transactions . TransferParameters ( outputs , b'<STR_LIT:target>' , b'<STR_LIT>' , <NUM_LIT:200> ) <EOL> result = self . target . transfer_bitcoin ( spec , <NUM_LIT:10> ) <EOL> self . assertEqual ( <NUM_LIT:2> , len ( result . vin ) ) <EOL> self . assert_input ( result . vin [ <NUM_LIT:0> ] , b'<STR_LIT:1>' * <NUM_LIT:32> , <NUM_LIT:1> , b'<STR_LIT:source>' ) <EOL> self . assert_input ( result . vin [ <NUM_LIT:1> ] , b'<STR_LIT:2>' * <NUM_LIT:32> , <NUM_LIT:2> , b'<STR_LIT:source>' ) <EOL> self . assertEqual ( <NUM_LIT:1> , len ( result . vout ) ) <EOL> self . assert_output ( result . vout [ <NUM_LIT:0> ] , <NUM_LIT:200> , b'<STR_LIT:target>' ) <EOL> def test_transfer_bitcoin_dust_limit ( self ) : <EOL> outputs = self . generate_outputs ( [ <EOL> ( <NUM_LIT> , b'<STR_LIT:source>' , None , <NUM_LIT:0> ) , <EOL> ] ) <EOL> spec = openassets . transactions . TransferParameters ( outputs , b'<STR_LIT:target>' , b'<STR_LIT>' , <NUM_LIT:10> ) <EOL> result = self . target . transfer_bitcoin ( spec , <NUM_LIT:5> ) <EOL> self . assertEqual ( <NUM_LIT:1> , len ( result . vin ) ) <EOL> self . assert_input ( result . vin [ <NUM_LIT:0> ] , b'<STR_LIT:0>' * <NUM_LIT:32> , <NUM_LIT:0> , b'<STR_LIT:source>' ) <EOL> self . assertEqual ( <NUM_LIT:2> , len ( result . vout ) ) <EOL> self . assert_output ( result . vout [ <NUM_LIT:0> ] , <NUM_LIT:10> , b'<STR_LIT>' ) <EOL> self . assert_output ( result . vout [ <NUM_LIT:1> ] , <NUM_LIT:10> , b'<STR_LIT:target>' ) <EOL> def test_transfer_bitcoin_insufficient_funds ( self ) : <EOL> outputs = self . generate_outputs ( [ <EOL> ( <NUM_LIT> , b'<STR_LIT:source>' , b'<STR_LIT>' , <NUM_LIT:50> ) , <EOL> ( <NUM_LIT> , b'<STR_LIT:source>' , None , <NUM_LIT:0> ) , <EOL> ( <NUM_LIT> , b'<STR_LIT:source>' , None , <NUM_LIT:0> ) <EOL> ] ) <EOL> spec = openassets . transactions . TransferParameters ( outputs , b'<STR_LIT:target>' , b'<STR_LIT>' , <NUM_LIT> ) <EOL> self . assertRaises ( <EOL> openassets . transactions . InsufficientFundsError , <EOL> self . target . transfer_bitcoin , spec , <NUM_LIT:10> ) <EOL> def test_transfer_bitcoin_dust_output ( self ) : <EOL> outputs = self . generate_outputs ( [ <EOL> ( <NUM_LIT> , b'<STR_LIT:source>' , None , <NUM_LIT:0> ) <EOL> ] ) <EOL> spec = openassets . transactions . TransferParameters ( outputs , b'<STR_LIT:target>' , b'<STR_LIT>' , <NUM_LIT:9> ) <EOL> self . assertRaises ( <EOL> openassets . transactions . DustOutputError , <EOL> self . target . transfer_bitcoin , spec , <NUM_LIT:10> ) <EOL> def test_transfer_bitcoin_dust_change ( self ) : <EOL> outputs = self . generate_outputs ( [ <EOL> ( <NUM_LIT> , b'<STR_LIT:source>' , None , <NUM_LIT:0> ) <EOL> ] ) <EOL> spec = openassets . transactions . TransferParameters ( outputs , b'<STR_LIT:target>' , b'<STR_LIT>' , <NUM_LIT> - <NUM_LIT:10> - <NUM_LIT:9> ) <EOL> self . assertRaises ( <EOL> openassets . transactions . DustOutputError , <EOL> self . target . transfer_bitcoin , spec , <NUM_LIT:10> ) <EOL> def test_transfer_assets_with_change ( self ) : <EOL> outputs = self . generate_outputs ( [ <EOL> ( <NUM_LIT:10> , b'<STR_LIT:source>' , b'<STR_LIT>' , <NUM_LIT:50> ) , <EOL> ( <NUM_LIT> , b'<STR_LIT:source>' , None , <NUM_LIT:0> ) , <EOL> ( <NUM_LIT:20> , b'<STR_LIT:source>' , b'<STR_LIT>' , <NUM_LIT:100> ) <EOL> ] ) <EOL> spec = openassets . transactions . TransferParameters ( outputs , b'<STR_LIT:target>' , b'<STR_LIT>' , <NUM_LIT> ) <EOL> result = self . target . transfer_assets ( b'<STR_LIT>' , spec , b'<STR_LIT>' , <NUM_LIT> ) <EOL> self . assertEqual ( <NUM_LIT:3> , len ( result . vin ) ) <EOL> self . assert_input ( result . vin [ <NUM_LIT:0> ] , b'<STR_LIT:0>' * <NUM_LIT:32> , <NUM_LIT:0> , b'<STR_LIT:source>' ) <EOL> self . assert_input ( result . vin [ <NUM_LIT:1> ] , b'<STR_LIT:2>' * <NUM_LIT:32> , <NUM_LIT:2> , b'<STR_LIT:source>' ) <EOL> self . assert_input ( result . vin [ <NUM_LIT:2> ] , b'<STR_LIT:1>' * <NUM_LIT:32> , <NUM_LIT:1> , b'<STR_LIT:source>' ) <EOL> self . assertEqual ( <NUM_LIT:4> , len ( result . vout ) ) <EOL> self . assert_marker ( result . vout [ <NUM_LIT:0> ] , [ <NUM_LIT> , <NUM_LIT:30> ] , b'<STR_LIT>' ) <EOL> self . assert_output ( result . vout [ <NUM_LIT:1> ] , <NUM_LIT:10> , b'<STR_LIT:target>' ) <EOL> self . assert_output ( result . vout [ <NUM_LIT:2> ] , <NUM_LIT:10> , b'<STR_LIT>' ) <EOL> self . assert_output ( result . vout [ <NUM_LIT:3> ] , <NUM_LIT:50> , b'<STR_LIT>' ) <EOL> def test_transfer_assets_no_change ( self ) : <EOL> outputs = self . generate_outputs ( [ <EOL> ( <NUM_LIT:10> , b'<STR_LIT:source>' , b'<STR_LIT>' , <NUM_LIT:50> ) , <EOL> ( <NUM_LIT> , b'<STR_LIT:source>' , None , <NUM_LIT:0> ) , <EOL> ( <NUM_LIT:10> , b'<STR_LIT:source>' , b'<STR_LIT>' , <NUM_LIT> ) <EOL> ] ) <EOL> spec = openassets . transactions . TransferParameters ( outputs , b'<STR_LIT:target>' , b'<STR_LIT>' , <NUM_LIT> ) <EOL> result = self . target . transfer_assets ( b'<STR_LIT>' , spec , b'<STR_LIT>' , <NUM_LIT> ) <EOL> self . assertEqual ( <NUM_LIT:3> , len ( result . vin ) ) <EOL> self . assert_input ( result . vin [ <NUM_LIT:0> ] , b'<STR_LIT:0>' * <NUM_LIT:32> , <NUM_LIT:0> , b'<STR_LIT:source>' ) <EOL> self . assert_input ( result . vin [ <NUM_LIT:1> ] , b'<STR_LIT:2>' * <NUM_LIT:32> , <NUM_LIT:2> , b'<STR_LIT:source>' ) <EOL> self . assert_input ( result . vin [ <NUM_LIT:2> ] , b'<STR_LIT:1>' * <NUM_LIT:32> , <NUM_LIT:1> , b'<STR_LIT:source>' ) <EOL> self . assertEqual ( <NUM_LIT:3> , len ( result . vout ) ) <EOL> self . assert_marker ( result . vout [ <NUM_LIT:0> ] , [ <NUM_LIT> ] , b'<STR_LIT>' ) <EOL> self . assert_output ( result . vout [ <NUM_LIT:1> ] , <NUM_LIT:10> , b'<STR_LIT:target>' ) <EOL> self . assert_output ( result . vout [ <NUM_LIT:2> ] , <NUM_LIT:50> , b'<STR_LIT>' ) <EOL> def test_transfer_assets_insufficient_asset_quantity ( self ) : <EOL> outputs = self . generate_outputs ( [ <EOL> ( <NUM_LIT:10> , b'<STR_LIT:source>' , b'<STR_LIT>' , <NUM_LIT:50> ) , <EOL> ( <NUM_LIT> , b'<STR_LIT:source>' , None , <NUM_LIT:0> ) , <EOL> ( <NUM_LIT:10> , b'<STR_LIT>' , None , <NUM_LIT:0> ) , <EOL> ( <NUM_LIT:10> , b'<STR_LIT:source>' , b'<STR_LIT>' , <NUM_LIT> ) <EOL> ] ) <EOL> spec = openassets . transactions . TransferParameters ( outputs , b'<STR_LIT:target>' , b'<STR_LIT>' , <NUM_LIT> ) <EOL> self . assertRaises ( <EOL> openassets . transactions . InsufficientAssetQuantityError , <EOL> self . target . transfer_assets , b'<STR_LIT>' , spec , b'<STR_LIT>' , <NUM_LIT> ) <EOL> def test_btc_asset_swap ( self ) : <EOL> outputs = self . generate_outputs ( [ <EOL> ( <NUM_LIT> , b'<STR_LIT>' , None , <NUM_LIT:0> ) , <EOL> ( <NUM_LIT:100> , b'<STR_LIT>' , None , <NUM_LIT:0> ) , <EOL> ( <NUM_LIT:10> , b'<STR_LIT>' , b'<STR_LIT>' , <NUM_LIT:50> ) , <EOL> ( <NUM_LIT:10> , b'<STR_LIT>' , b'<STR_LIT>' , <NUM_LIT:100> ) , <EOL> ] ) <EOL> btc_spec = openassets . transactions . TransferParameters ( outputs [ <NUM_LIT:0> : <NUM_LIT:2> ] , b'<STR_LIT>' , b'<STR_LIT>' , <NUM_LIT> ) <EOL> asset_spec = openassets . transactions . TransferParameters ( outputs [ <NUM_LIT:2> : <NUM_LIT:4> ] , b'<STR_LIT>' , b'<STR_LIT>' , <NUM_LIT> ) <EOL> result = self . target . btc_asset_swap ( btc_spec , b'<STR_LIT>' , asset_spec , <NUM_LIT:10> ) <EOL> self . assertEqual ( <NUM_LIT:4> , len ( result . vin ) ) <EOL> self . assert_input ( result . vin [ <NUM_LIT:0> ] , b'<STR_LIT:2>' * <NUM_LIT:32> , <NUM_LIT:2> , b'<STR_LIT>' ) <EOL> self . assert_input ( result . vin [ <NUM_LIT:1> ] , b'<STR_LIT:3>' * <NUM_LIT:32> , <NUM_LIT:3> , b'<STR_LIT>' ) <EOL> self . assert_input ( result . vin [ <NUM_LIT:2> ] , b'<STR_LIT:0>' * <NUM_LIT:32> , <NUM_LIT:0> , b'<STR_LIT>' ) <EOL> self . assert_input ( result . vin [ <NUM_LIT:3> ] , b'<STR_LIT:1>' * <NUM_LIT:32> , <NUM_LIT:1> , b'<STR_LIT>' ) <EOL> self . assertEqual ( <NUM_LIT:5> , len ( result . vout ) ) <EOL> self . assert_marker ( result . vout [ <NUM_LIT:0> ] , [ <NUM_LIT> , <NUM_LIT:30> ] , b'<STR_LIT>' ) <EOL> self . assert_output ( result . vout [ <NUM_LIT:1> ] , <NUM_LIT:10> , b'<STR_LIT>' ) <EOL> self . assert_output ( result . vout [ <NUM_LIT:2> ] , <NUM_LIT:10> , b'<STR_LIT>' ) <EOL> self . assert_output ( result . vout [ <NUM_LIT:3> ] , <NUM_LIT:20> , b'<STR_LIT>' ) <EOL> self . assert_output ( result . vout [ <NUM_LIT:4> ] , <NUM_LIT> , b'<STR_LIT>' ) <EOL> def test_asset_asset_swap ( self ) : <EOL> outputs = self . generate_outputs ( [ <EOL> ( <NUM_LIT:10> , b'<STR_LIT>' , b'<STR_LIT>' , <NUM_LIT:100> ) , <EOL> ( <NUM_LIT:10> , b'<STR_LIT>' , b'<STR_LIT>' , <NUM_LIT> ) , <EOL> ( <NUM_LIT> , b'<STR_LIT>' , None , <NUM_LIT:0> ) , <EOL> ( <NUM_LIT:10> , b'<STR_LIT>' , b'<STR_LIT>' , <NUM_LIT> ) , <EOL> ( <NUM_LIT:100> , b'<STR_LIT>' , None , <NUM_LIT:0> ) , <EOL> ] ) <EOL> asset1_spec = openassets . transactions . TransferParameters ( outputs [ <NUM_LIT:0> : <NUM_LIT:3> ] , b'<STR_LIT>' , b'<STR_LIT>' , <NUM_LIT> ) <EOL> asset2_spec = openassets . transactions . TransferParameters ( outputs [ <NUM_LIT:3> : <NUM_LIT:4> ] , b'<STR_LIT>' , b'<STR_LIT>' , <NUM_LIT> ) <EOL> result = self . target . asset_asset_swap ( b'<STR_LIT>' , asset1_spec , b'<STR_LIT>' , asset2_spec , <NUM_LIT:20> ) <EOL> self . assertEqual ( <NUM_LIT:4> , len ( result . vin ) ) <EOL> self . assert_input ( result . vin [ <NUM_LIT:0> ] , b'<STR_LIT:0>' * <NUM_LIT:32> , <NUM_LIT:0> , b'<STR_LIT>' ) <EOL> self . assert_input ( result . vin [ <NUM_LIT:1> ] , b'<STR_LIT:1>' * <NUM_LIT:32> , <NUM_LIT:1> , b'<STR_LIT>' ) <EOL> self . assert_input ( result . vin [ <NUM_LIT:2> ] , b'<STR_LIT:3>' * <NUM_LIT:32> , <NUM_LIT:3> , b'<STR_LIT>' ) <EOL> self . assert_input ( result . vin [ <NUM_LIT:3> ] , b'<STR_LIT:2>' * <NUM_LIT:32> , <NUM_LIT:2> , b'<STR_LIT>' ) <EOL> self . assertEqual ( <NUM_LIT:6> , len ( result . vout ) ) <EOL> self . assert_marker ( result . vout [ <NUM_LIT:0> ] , [ <NUM_LIT> , <NUM_LIT> , <NUM_LIT> , <NUM_LIT> ] , b'<STR_LIT>' ) <EOL> self . assert_output ( result . vout [ <NUM_LIT:1> ] , <NUM_LIT:10> , b'<STR_LIT>' ) <EOL> self . assert_output ( result . vout [ <NUM_LIT:2> ] , <NUM_LIT:10> , b'<STR_LIT>' ) <EOL> self . assert_output ( result . vout [ <NUM_LIT:3> ] , <NUM_LIT:10> , b'<STR_LIT>' ) <EOL> self . assert_output ( result . vout [ <NUM_LIT:4> ] , <NUM_LIT:10> , b'<STR_LIT>' ) <EOL> self . assert_output ( result . vout [ <NUM_LIT:5> ] , <NUM_LIT:50> , b'<STR_LIT>' ) <EOL> def generate_outputs ( self , definitions ) : <EOL> result = [ ] <EOL> for i , item in enumerate ( definitions ) : <EOL> byte = bytes ( str ( i ) , encoding = '<STR_LIT>' ) <EOL> result . append ( openassets . transactions . SpendableOutput ( <EOL> out_point = bitcoin . core . COutPoint ( byte * <NUM_LIT:32> , i ) , <EOL> output = openassets . protocol . TransactionOutput ( <EOL> item [ <NUM_LIT:0> ] , bitcoin . core . script . CScript ( item [ <NUM_LIT:1> ] ) , item [ <NUM_LIT:2> ] , item [ <NUM_LIT:3> ] ) <EOL> ) ) <EOL> return result <EOL> def assert_input ( self , input , transaction_hash , output_index , script ) : <EOL> self . assertEqual ( transaction_hash , input . prevout . hash ) <EOL> self . assertEqual ( output_index , input . prevout . n ) <EOL> self . assertEqual ( script , bytes ( input . scriptSig ) ) <EOL> def assert_output ( self , output , nValue , scriptPubKey ) : <EOL> self . assertEqual ( nValue , output . nValue ) <EOL> self . assertEqual ( scriptPubKey , bytes ( output . scriptPubKey ) ) <EOL> def assert_marker ( self , output , asset_quantities , metadata ) : <EOL> payload = openassets . protocol . MarkerOutput . parse_script ( output . scriptPubKey ) <EOL> marker_output = openassets . protocol . MarkerOutput . deserialize_payload ( payload ) <EOL> self . assertEqual ( <NUM_LIT:0> , output . nValue ) <EOL> self . assertEqual ( asset_quantities , marker_output . asset_quantities ) <EOL> self . assertEqual ( metadata , marker_output . metadata ) <EOL> class SpendableOutputTests ( unittest . TestCase ) : <EOL> def test_init_success ( self ) : <EOL> target = openassets . transactions . SpendableOutput ( <EOL> bitcoin . core . COutPoint ( '<STR_LIT>' * <NUM_LIT:32> ) , <EOL> openassets . protocol . TransactionOutput ( <NUM_LIT:100> ) ) <EOL> self . assertEqual ( '<STR_LIT>' * <NUM_LIT:32> , target . out_point . hash ) <EOL> self . assertEqual ( <NUM_LIT:100> , target . output . value ) </s>
