github.com/algorand/go-algorand-sdk@v1.24.0/future/transactionSigner_test.go (about)

     1  package future
     2  
     3  import (
     4  	"crypto/ed25519"
     5  	"testing"
     6  
     7  	"github.com/algorand/go-algorand-sdk/crypto"
     8  	"github.com/algorand/go-algorand-sdk/mnemonic"
     9  	"github.com/algorand/go-algorand-sdk/types"
    10  	"github.com/stretchr/testify/require"
    11  )
    12  
    13  func TestMakeBasicAccountTransactionSigner(t *testing.T) {
    14  	account := crypto.GenerateAccount()
    15  	txSigner := BasicAccountTransactionSigner{Account: account}
    16  
    17  	addr, err := types.DecodeAddress("DN7MBMCL5JQ3PFUQS7TMX5AH4EEKOBJVDUF4TCV6WERATKFLQF4MQUPZTA")
    18  	require.NoError(t, err)
    19  	tx := types.Transaction{
    20  		Type: types.PaymentTx,
    21  		Header: types.Header{
    22  			Sender:     addr,
    23  			Fee:        217000,
    24  			FirstValid: 972508,
    25  			LastValid:  973508,
    26  			Note:       []byte{180, 81, 121, 57, 252, 250, 210, 113},
    27  			GenesisID:  "testnet-v31.0",
    28  		},
    29  		PaymentTxnFields: types.PaymentTxnFields{
    30  			Receiver: addr,
    31  			Amount:   5000,
    32  		},
    33  	}
    34  
    35  	sigs, err := txSigner.SignTransactions([]types.Transaction{tx}, []int{0})
    36  	require.NoError(t, err)
    37  
    38  	_, expectedSig, err := crypto.SignTransaction(account.PrivateKey, tx)
    39  	require.NoError(t, err)
    40  	require.Len(t, sigs, 1)
    41  	require.Equal(t, sigs[0], expectedSig)
    42  }
    43  
    44  func TestMakeLogicSigAccountTransactionSigner(t *testing.T) {
    45  	program := []byte{1, 32, 1, 1, 34}
    46  	args := [][]byte{
    47  		{0x01},
    48  		{0x02, 0x03},
    49  	}
    50  	account := crypto.GenerateAccount()
    51  	lsig, err := crypto.MakeLogicSigAccountDelegated(program, args, account.PrivateKey)
    52  	require.NoError(t, err)
    53  
    54  	programHash := "6Z3C3LDVWGMX23BMSYMANACQOSINPFIRF77H7N3AWJZYV6OH6GWTJKVMXY"
    55  	programAddr, err := types.DecodeAddress(programHash)
    56  	require.NoError(t, err)
    57  
    58  	txSigner := LogicSigAccountTransactionSigner{LogicSigAccount: lsig}
    59  
    60  	require.NoError(t, err)
    61  	tx := types.Transaction{
    62  		Type: types.PaymentTx,
    63  		Header: types.Header{
    64  			Sender:     programAddr,
    65  			Fee:        217000,
    66  			FirstValid: 972508,
    67  			LastValid:  973508,
    68  			Note:       []byte{180, 81, 121, 57, 252, 250, 210, 113},
    69  			GenesisID:  "testnet-v31.0",
    70  		},
    71  		PaymentTxnFields: types.PaymentTxnFields{
    72  			Receiver: programAddr,
    73  			Amount:   5000,
    74  		},
    75  	}
    76  
    77  	sigs, err := txSigner.SignTransactions([]types.Transaction{tx}, []int{0})
    78  	require.NoError(t, err)
    79  
    80  	_, expectedSig, err := crypto.SignLogicSigAccountTransaction(lsig, tx)
    81  	require.NoError(t, err)
    82  	require.Equal(t, sigs[0], expectedSig)
    83  }
    84  
    85  func makeTestMultisigAccount(t *testing.T) (crypto.MultisigAccount, ed25519.PrivateKey, ed25519.PrivateKey, ed25519.PrivateKey) {
    86  	addr1, err := types.DecodeAddress("DN7MBMCL5JQ3PFUQS7TMX5AH4EEKOBJVDUF4TCV6WERATKFLQF4MQUPZTA")
    87  	require.NoError(t, err)
    88  	addr2, err := types.DecodeAddress("BFRTECKTOOE7A5LHCF3TTEOH2A7BW46IYT2SX5VP6ANKEXHZYJY77SJTVM")
    89  	require.NoError(t, err)
    90  	addr3, err := types.DecodeAddress("47YPQTIGQEO7T4Y4RWDYWEKV6RTR2UNBQXBABEEGM72ESWDQNCQ52OPASU")
    91  	require.NoError(t, err)
    92  	ma, err := crypto.MultisigAccountWithParams(1, 2, []types.Address{
    93  		addr1,
    94  		addr2,
    95  		addr3,
    96  	})
    97  	require.NoError(t, err)
    98  	mn1 := "auction inquiry lava second expand liberty glass involve ginger illness length room item discover ahead table doctor term tackle cement bonus profit right above catch"
    99  	sk1, err := mnemonic.ToPrivateKey(mn1)
   100  	require.NoError(t, err)
   101  	mn2 := "since during average anxiety protect cherry club long lawsuit loan expand embark forum theory winter park twenty ball kangaroo cram burst board host ability left"
   102  	sk2, err := mnemonic.ToPrivateKey(mn2)
   103  	require.NoError(t, err)
   104  	mn3 := "advice pudding treat near rule blouse same whisper inner electric quit surface sunny dismiss leader blood seat clown cost exist hospital century reform able sponsor"
   105  	sk3, err := mnemonic.ToPrivateKey(mn3)
   106  	return ma, sk1, sk2, sk3
   107  }
   108  
   109  func TestMakeMultiSigAccountTransactionSigner(t *testing.T) {
   110  	ma, sk1, _, _ := makeTestMultisigAccount(t)
   111  	fromAddr, err := ma.Address()
   112  	require.NoError(t, err)
   113  	toAddr, err := types.DecodeAddress("DN7MBMCL5JQ3PFUQS7TMX5AH4EEKOBJVDUF4TCV6WERATKFLQF4MQUPZTA")
   114  	require.NoError(t, err)
   115  
   116  	txSigner := MultiSigAccountTransactionSigner{Msig: ma, Sks: [][]byte{sk1}}
   117  	tx := types.Transaction{
   118  		Type: types.PaymentTx,
   119  		Header: types.Header{
   120  			Sender:     fromAddr,
   121  			Fee:        217000,
   122  			FirstValid: 972508,
   123  			LastValid:  973508,
   124  			Note:       []byte{180, 81, 121, 57, 252, 250, 210, 113},
   125  			GenesisID:  "testnet-v31.0",
   126  		},
   127  		PaymentTxnFields: types.PaymentTxnFields{
   128  			Receiver: toAddr,
   129  			Amount:   5000,
   130  		},
   131  	}
   132  
   133  	sigs, err := txSigner.SignTransactions([]types.Transaction{tx}, []int{0})
   134  	require.NoError(t, err)
   135  
   136  	_, expectedSig, err := crypto.SignMultisigTransaction(sk1, ma, tx)
   137  	require.NoError(t, err)
   138  	require.Equal(t, sigs[0], expectedSig)
   139  }