github.com/algorand/go-algorand-sdk@v1.24.0/templates/templates_test.go (about) 1 package templates 2 3 import ( 4 "encoding/base64" 5 "testing" 6 7 "github.com/algorand/go-algorand-sdk/encoding/msgpack" 8 "github.com/algorand/go-algorand-sdk/future" 9 "github.com/algorand/go-algorand-sdk/types" 10 11 "github.com/stretchr/testify/require" 12 ) 13 14 func TestSplit(t *testing.T) { 15 // Inputs 16 owner := "WO3QIJ6T4DZHBX5PWJH26JLHFSRT7W7M2DJOULPXDTUS6TUX7ZRIO4KDFY" 17 receivers := [2]string{"W6UUUSEAOGLBHT7VFT4H2SDATKKSG6ZBUIJXTZMSLW36YS44FRP5NVAU7U", "XCIBIN7RT4ZXGBMVAMU3QS6L5EKB7XGROC5EPCNHHYXUIBAA5Q6C5Y7NEU"} 18 ratn, ratd := uint64(30), uint64(100) // receiverOne gets 30/100 of whatever is sent to contract address 19 expiryRound := uint64(123456) 20 minPay := uint64(10000) 21 maxFee := uint64(5000000) 22 c, err := MakeSplit(owner, receivers[0], receivers[1], ratn, ratd, expiryRound, minPay, maxFee) 23 // Outputs 24 require.NoError(t, err) 25 goldenProgram := "ASAIAcCWsQICAMDEB2QekE4mAyCztwQn0+DycN+vsk+vJWcsoz/b7NDS6i33HOkvTpf+YiC3qUpIgHGWE8/1LPh9SGCalSN7IaITeeWSXbfsS5wsXyC4kBQ38Z8zcwWVAym4S8vpFB/c0XC6R4mnPi9EBADsPDEQIhIxASMMEDIEJBJAABkxCSgSMQcyAxIQMQglEhAxAiEEDRAiQAAuMwAAMwEAEjEJMgMSEDMABykSEDMBByoSEDMACCEFCzMBCCEGCxIQMwAIIQcPEBA=" 26 require.Equal(t, goldenProgram, base64.StdEncoding.EncodeToString(c.GetProgram())) 27 goldenAddress := "HDY7A4VHBWQWQZJBEMASFOUZKBNGWBMJEMUXAGZ4SPIRQ6C24MJHUZKFGY" 28 require.Equal(t, goldenAddress, c.GetAddress()) 29 goldenGenesisHash := "f4OxZX/x/FO5LcGBSKHWXfwtSx+j1ncoSt3SABJtkGk=" 30 genesisBytes, _ := base64.StdEncoding.DecodeString(goldenGenesisHash) 31 goldenStx := "gqRsc2lngaFsxM4BIAgBwJaxAgIAwMQHZB6QTiYDILO3BCfT4PJw36+yT68lZyyjP9vs0NLqLfcc6S9Ol/5iILepSkiAcZYTz/Us+H1IYJqVI3shohN55ZJdt+xLnCxfILiQFDfxnzNzBZUDKbhLy+kUH9zRcLpHiac+L0QEAOw8MRAiEjEBIwwQMgQkEkAAGTEJKBIxBzIDEhAxCCUSEDECIQQNECJAAC4zAAAzAQASMQkyAxIQMwAHKRIQMwEHKhIQMwAIIQULMwEIIQYLEhAzAAghBw8QEKN0eG6Jo2FtdM4ABJPgo2ZlZc4AId/gomZ2AaJnaMQgf4OxZX/x/FO5LcGBSKHWXfwtSx+j1ncoSt3SABJtkGmjZ3JwxCBLA74bTV35FJNL1h0K9ZbRU24b4M1JRkD1YTogvvDXbqJsdmSjcmN2xCC3qUpIgHGWE8/1LPh9SGCalSN7IaITeeWSXbfsS5wsX6NzbmTEIDjx8HKnDaFoZSEjASK6mVBaawWJIylwGzyT0Rh4WuMSpHR5cGWjcGF5gqRsc2lngaFsxM4BIAgBwJaxAgIAwMQHZB6QTiYDILO3BCfT4PJw36+yT68lZyyjP9vs0NLqLfcc6S9Ol/5iILepSkiAcZYTz/Us+H1IYJqVI3shohN55ZJdt+xLnCxfILiQFDfxnzNzBZUDKbhLy+kUH9zRcLpHiac+L0QEAOw8MRAiEjEBIwwQMgQkEkAAGTEJKBIxBzIDEhAxCCUSEDECIQQNECJAAC4zAAAzAQASMQkyAxIQMwAHKRIQMwEHKhIQMwAIIQULMwEIIQYLEhAzAAghBw8QEKN0eG6Jo2FtdM4AD0JAo2ZlZc4AId/gomZ2AaJnaMQgf4OxZX/x/FO5LcGBSKHWXfwtSx+j1ncoSt3SABJtkGmjZ3JwxCBLA74bTV35FJNL1h0K9ZbRU24b4M1JRkD1YTogvvDXbqJsdmSjcmN2xCC4kBQ38Z8zcwWVAym4S8vpFB/c0XC6R4mnPi9EBADsPKNzbmTEIDjx8HKnDaFoZSEjASK6mVBaawWJIylwGzyT0Rh4WuMSpHR5cGWjcGF5" 32 params := types.SuggestedParams{ 33 Fee: 10000, 34 FirstRoundValid: 1, 35 LastRoundValid: 100, 36 GenesisHash: genesisBytes, 37 } 38 stx, err := GetSplitFundsTransaction(c.GetProgram(), minPay*(ratd+ratn), params) 39 require.NoError(t, err) 40 require.Equal(t, goldenStx, base64.StdEncoding.EncodeToString(stx)) 41 } 42 43 func TestHTLCSha256(t *testing.T) { 44 // Inputs 45 owner := "726KBOYUJJNE5J5UHCSGQGWIBZWKCBN4WYD7YVSTEXEVNFPWUIJ7TAEOPM" 46 receiver := "42NJMHTPFVPXVSDGA6JGKUV6TARV5UZTMPFIREMLXHETRKIVW34QFSDFRE" 47 hashFn := "sha256" 48 hashImg := "EHZhE08h/HwCIj1Qq56zYAvD/8NxJCOh5Hux+anb9V8=" 49 expiryRound := uint64(600000) 50 maxFee := uint64(1000) 51 c, err := MakeHTLC(owner, receiver, hashFn, hashImg, expiryRound, maxFee) 52 // Outputs 53 require.NoError(t, err) 54 goldenProgram := "ASAE6AcBAMDPJCYDIOaalh5vLV96yGYHkmVSvpgjXtMzY8qIkYu5yTipFbb5IBB2YRNPIfx8AiI9UKues2ALw//DcSQjoeR7sfmp2/VfIP68oLsUSlpOp7Q4pGgayA5soQW8tgf8VlMlyVaV9qITMQEiDjEQIxIQMQcyAxIQMQgkEhAxCSgSLQEpEhAxCSoSMQIlDRAREA==" 55 require.Equal(t, goldenProgram, base64.StdEncoding.EncodeToString(c.GetProgram())) 56 goldenAddress := "FBZIR3RWVT2BTGVOG25H3VAOLVD54RTCRNRLQCCJJO6SVSCT5IVDYKNCSU" 57 require.Equal(t, goldenAddress, c.GetAddress()) 58 genesisHash := "f4OxZX/x/FO5LcGBSKHWXfwtSx+j1ncoSt3SABJtkGk=" 59 genesisBytes, _ := base64.StdEncoding.DecodeString(genesisHash) 60 params := types.SuggestedParams{ 61 Fee: 0, 62 FirstRoundValid: 1, 63 LastRoundValid: 100, 64 GenesisID: "", 65 GenesisHash: genesisBytes, 66 } 67 txn, err := future.MakePaymentTxn(goldenAddress, receiver, 0, nil, receiver, params) 68 require.NoError(t, err) 69 preImageAsBase64 := "cHJlaW1hZ2U=" 70 _, stx, err := SignTransactionWithHTLCUnlock(c.GetProgram(), txn, preImageAsBase64) 71 require.NoError(t, err) 72 goldenStx := "gqRsc2lngqNhcmeRxAhwcmVpbWFnZaFsxJcBIAToBwEAwM8kJgMg5pqWHm8tX3rIZgeSZVK+mCNe0zNjyoiRi7nJOKkVtvkgEHZhE08h/HwCIj1Qq56zYAvD/8NxJCOh5Hux+anb9V8g/ryguxRKWk6ntDikaBrIDmyhBby2B/xWUyXJVpX2ohMxASIOMRAjEhAxBzIDEhAxCCQSEDEJKBItASkSEDEJKhIxAiUNEBEQo3R4boelY2xvc2XEIOaalh5vLV96yGYHkmVSvpgjXtMzY8qIkYu5yTipFbb5o2ZlZc0D6KJmdgGiZ2jEIH+DsWV/8fxTuS3BgUih1l38LUsfo9Z3KErd0gASbZBpomx2ZKNzbmTEIChyiO42rPQZmq42un3UDl1H3kZii2K4CElLvSrIU+oqpHR5cGWjcGF5" 73 require.Equal(t, goldenStx, base64.StdEncoding.EncodeToString(stx)) 74 } 75 76 func TestHTLCKeccak256(t *testing.T) { 77 // Inputs 78 owner := "726KBOYUJJNE5J5UHCSGQGWIBZWKCBN4WYD7YVSTEXEVNFPWUIJ7TAEOPM" 79 receiver := "42NJMHTPFVPXVSDGA6JGKUV6TARV5UZTMPFIREMLXHETRKIVW34QFSDFRE" 80 hashFn := "keccak256" 81 hashImg := "D7d4MrvBrOSyNSmUs0kzucuJ+/9DbLkA6OOOocywoAc=" 82 expiryRound := uint64(600000) 83 maxFee := uint64(1000) 84 c, err := MakeHTLC(owner, receiver, hashFn, hashImg, expiryRound, maxFee) 85 // Outputs 86 require.NoError(t, err) 87 goldenProgram := "ASAE6AcBAMDPJCYDIOaalh5vLV96yGYHkmVSvpgjXtMzY8qIkYu5yTipFbb5IA+3eDK7wazksjUplLNJM7nLifv/Q2y5AOjjjqHMsKAHIP68oLsUSlpOp7Q4pGgayA5soQW8tgf8VlMlyVaV9qITMQEiDjEQIxIQMQcyAxIQMQgkEhAxCSgSLQIpEhAxCSoSMQIlDRAREA==" 88 require.Equal(t, goldenProgram, base64.StdEncoding.EncodeToString(c.GetProgram())) 89 goldenAddress := "3MJ6JY3P6AU4R6I2RASYSAOPNI3QMWPZ7HYXJRNRGBIAXCHAY7QZRBH5PQ" 90 require.Equal(t, goldenAddress, c.GetAddress()) 91 genesisHash := "f4OxZX/x/FO5LcGBSKHWXfwtSx+j1ncoSt3SABJtkGk=" 92 genesisBytes, _ := base64.StdEncoding.DecodeString(genesisHash) 93 params := types.SuggestedParams{ 94 Fee: 0, 95 FirstRoundValid: 1, 96 LastRoundValid: 100, 97 GenesisID: "", 98 GenesisHash: genesisBytes, 99 } 100 txn, err := future.MakePaymentTxn(goldenAddress, receiver, 0, nil, receiver, params) 101 require.NoError(t, err) 102 preImageAsBase64 := "cHJlaW1hZ2U=" 103 _, stx, err := SignTransactionWithHTLCUnlock(c.GetProgram(), txn, preImageAsBase64) 104 require.NoError(t, err) 105 goldenStx := "gqRsc2lngqNhcmeRxAhwcmVpbWFnZaFsxJcBIAToBwEAwM8kJgMg5pqWHm8tX3rIZgeSZVK+mCNe0zNjyoiRi7nJOKkVtvkgD7d4MrvBrOSyNSmUs0kzucuJ+/9DbLkA6OOOocywoAcg/ryguxRKWk6ntDikaBrIDmyhBby2B/xWUyXJVpX2ohMxASIOMRAjEhAxBzIDEhAxCCQSEDEJKBItAikSEDEJKhIxAiUNEBEQo3R4boelY2xvc2XEIOaalh5vLV96yGYHkmVSvpgjXtMzY8qIkYu5yTipFbb5o2ZlZc0D6KJmdgGiZ2jEIH+DsWV/8fxTuS3BgUih1l38LUsfo9Z3KErd0gASbZBpomx2ZKNzbmTEINsT5ONv8CnI+RqIJYkBz2o3Bln5+fF0xbEwUAuI4MfhpHR5cGWjcGF5" 106 require.Equal(t, goldenStx, base64.StdEncoding.EncodeToString(stx)) 107 } 108 109 func TestPeriodicPayment(t *testing.T) { 110 // Inputs 111 receiver := "SKXZDBHECM6AS73GVPGJHMIRDMJKEAN5TUGMUPSKJCQ44E6M6TC2H2UJ3I" 112 artificialLease := "AQIDBAUGBwgBAgMEBQYHCAECAwQFBgcIAQIDBAUGBwg=" 113 amount := uint64(500000) 114 withdrawalWindow := uint64(95) 115 period := uint64(100) 116 maxFee := uint64(1000) 117 expiryRound := uint64(2445756) 118 c, err := makePeriodicPaymentWithLease(receiver, artificialLease, amount, withdrawalWindow, period, expiryRound, maxFee) 119 // Outputs 120 require.NoError(t, err) 121 goldenProgram := "ASAHAegHZABfoMIevKOVASYCIAECAwQFBgcIAQIDBAUGBwgBAgMEBQYHCAECAwQFBgcIIJKvkYTkEzwJf2arzJOxERsSogG9nQzKPkpIoc4TzPTFMRAiEjEBIw4QMQIkGCUSEDEEIQQxAggSEDEGKBIQMQkyAxIxBykSEDEIIQUSEDEJKRIxBzIDEhAxAiEGDRAxCCUSEBEQ" 122 contractBytes := c.GetProgram() 123 require.Equal(t, goldenProgram, base64.StdEncoding.EncodeToString(contractBytes)) 124 goldenAddress := "JMS3K4LSHPULANJIVQBTEDP5PZK6HHMDQS4OKHIMHUZZ6OILYO3FVQW7IY" 125 require.Equal(t, goldenAddress, c.GetAddress()) 126 goldenGenesisHash := "f4OxZX/x/FO5LcGBSKHWXfwtSx+j1ncoSt3SABJtkGk=" 127 genesisBytes, err := base64.StdEncoding.DecodeString(goldenGenesisHash) 128 require.NoError(t, err) 129 stx, err := GetPeriodicPaymentWithdrawalTransaction(contractBytes, 1200, 0, genesisBytes) 130 require.NoError(t, err) 131 goldenStx := "gqRsc2lngaFsxJkBIAcB6AdkAF+gwh68o5UBJgIgAQIDBAUGBwgBAgMEBQYHCAECAwQFBgcIAQIDBAUGBwggkq+RhOQTPAl/ZqvMk7ERGxKiAb2dDMo+SkihzhPM9MUxECISMQEjDhAxAiQYJRIQMQQhBDECCBIQMQYoEhAxCTIDEjEHKRIQMQghBRIQMQkpEjEHMgMSEDECIQYNEDEIJRIQERCjdHhuiaNhbXTOAAehIKNmZWXNA+iiZnbNBLCiZ2jEIH+DsWV/8fxTuS3BgUih1l38LUsfo9Z3KErd0gASbZBpomx2zQUPomx4xCABAgMEBQYHCAECAwQFBgcIAQIDBAUGBwgBAgMEBQYHCKNyY3bEIJKvkYTkEzwJf2arzJOxERsSogG9nQzKPkpIoc4TzPTFo3NuZMQgSyW1cXI76LA1KKwDMg39flXjnYOEuOUdDD0znzkLw7akdHlwZaNwYXk=" 132 require.Equal(t, goldenStx, base64.StdEncoding.EncodeToString(stx)) 133 } 134 135 func TestDynamicFee(t *testing.T) { 136 // Inputs 137 receiver := "726KBOYUJJNE5J5UHCSGQGWIBZWKCBN4WYD7YVSTEXEVNFPWUIJ7TAEOPM" 138 amount := uint64(5000) 139 firstValid := uint64(12345) 140 lastValid := uint64(12346) 141 closeRemainder := "42NJMHTPFVPXVSDGA6JGKUV6TARV5UZTMPFIREMLXHETRKIVW34QFSDFRE" 142 artificialLease := "f4OxZX/x/FO5LcGBSKHWXfwtSx+j1ncoSt3SABJtkGk=" 143 c, err := makeDynamicFeeWithLease(receiver, closeRemainder, artificialLease, amount, firstValid, lastValid) 144 require.NoError(t, err) 145 goldenGenesisHash := "f4OxZX/x/FO5LcGBSKHWXfwtSx+j1ncoSt3SABJtkGk=" 146 genesisBytes, err := base64.StdEncoding.DecodeString(goldenGenesisHash) 147 require.NoError(t, err) 148 contractBytes := c.GetProgram() 149 require.NoError(t, err) 150 privateKeyOneB64 := "cv8E0Ln24FSkwDgGeuXKStOTGcze5u8yldpXxgrBxumFPYdMJymqcGoxdDeyuM8t6Kxixfq0PJCyJP71uhYT7w==" 151 privateKeyOne, err := base64.StdEncoding.DecodeString(privateKeyOneB64) 152 txn, lsig, err := SignDynamicFee(contractBytes, privateKeyOne, genesisBytes) 153 require.NoError(t, err) 154 goldenLsig := "gqFsxLEBIAUCAYgnuWC6YCYDIP68oLsUSlpOp7Q4pGgayA5soQW8tgf8VlMlyVaV9qITIOaalh5vLV96yGYHkmVSvpgjXtMzY8qIkYu5yTipFbb5IH+DsWV/8fxTuS3BgUih1l38LUsfo9Z3KErd0gASbZBpMgQiEjMAECMSEDMABzEAEhAzAAgxARIQMRYjEhAxECMSEDEHKBIQMQkpEhAxCCQSEDECJRIQMQQhBBIQMQYqEhCjc2lnxEAhLNdfdDp9Wbi0YwsEQCpP7TVHbHG7y41F4MoESNW/vL1guS+5Wj4f5V9fmM63/VKTSMFidHOSwm5o+pbV5lYH" 155 require.Equal(t, goldenLsig, base64.StdEncoding.EncodeToString(msgpack.Encode(lsig))) 156 goldenTxn := "iqNhbXTNE4ilY2xvc2XEIOaalh5vLV96yGYHkmVSvpgjXtMzY8qIkYu5yTipFbb5o2ZlZc0D6KJmds0wOaJnaMQgf4OxZX/x/FO5LcGBSKHWXfwtSx+j1ncoSt3SABJtkGmibHbNMDqibHjEIH+DsWV/8fxTuS3BgUih1l38LUsfo9Z3KErd0gASbZBpo3JjdsQg/ryguxRKWk6ntDikaBrIDmyhBby2B/xWUyXJVpX2ohOjc25kxCCFPYdMJymqcGoxdDeyuM8t6Kxixfq0PJCyJP71uhYT76R0eXBlo3BheQ==" 157 require.Equal(t, goldenTxn, base64.StdEncoding.EncodeToString(msgpack.Encode(txn))) 158 privateKeyTwoB64 := "2qjz96Vj9M6YOqtNlfJUOKac13EHCXyDty94ozCjuwwriI+jzFgStFx9E6kEk1l4+lFsW4Te2PY1KV8kNcccRg==" 159 privateKeyTwo, err := base64.StdEncoding.DecodeString(privateKeyTwoB64) 160 stxns, err := GetDynamicFeeTransactions(txn, lsig, privateKeyTwo, 1234) 161 require.NoError(t, err) 162 // Outputs 163 goldenProgram := "ASAFAgGIJ7lgumAmAyD+vKC7FEpaTqe0OKRoGsgObKEFvLYH/FZTJclWlfaiEyDmmpYeby1feshmB5JlUr6YI17TM2PKiJGLuck4qRW2+SB/g7Flf/H8U7ktwYFIodZd/C1LH6PWdyhK3dIAEm2QaTIEIhIzABAjEhAzAAcxABIQMwAIMQESEDEWIxIQMRAjEhAxBygSEDEJKRIQMQgkEhAxAiUSEDEEIQQSEDEGKhIQ" 164 require.Equal(t, goldenProgram, base64.StdEncoding.EncodeToString(contractBytes)) 165 goldenAddress := "GCI4WWDIWUFATVPOQ372OZYG52EULPUZKI7Y34MXK3ZJKIBZXHD2H5C5TI" 166 require.Equal(t, goldenAddress, c.GetAddress()) 167 goldenStxns := "gqNzaWfEQJBNVry9qdpnco+uQzwFicUWHteYUIxwDkdHqY5Qw2Q8Fc2StrQUgN+2k8q4rC0LKrTMJQnE+mLWhZgMMJvq3QCjdHhuiqNhbXTOAAWq6qNmZWXOAATzvqJmds0wOaJnaMQgf4OxZX/x/FO5LcGBSKHWXfwtSx+j1ncoSt3SABJtkGmjZ3JwxCCCVfqhCinRBXKMIq9eSrJQIXZ+7iXUTig91oGd/mZEAqJsds0wOqJseMQgf4OxZX/x/FO5LcGBSKHWXfwtSx+j1ncoSt3SABJtkGmjcmN2xCCFPYdMJymqcGoxdDeyuM8t6Kxixfq0PJCyJP71uhYT76NzbmTEICuIj6PMWBK0XH0TqQSTWXj6UWxbhN7Y9jUpXyQ1xxxGpHR5cGWjcGF5gqRsc2lngqFsxLEBIAUCAYgnuWC6YCYDIP68oLsUSlpOp7Q4pGgayA5soQW8tgf8VlMlyVaV9qITIOaalh5vLV96yGYHkmVSvpgjXtMzY8qIkYu5yTipFbb5IH+DsWV/8fxTuS3BgUih1l38LUsfo9Z3KErd0gASbZBpMgQiEjMAECMSEDMABzEAEhAzAAgxARIQMRYjEhAxECMSEDEHKBIQMQkpEhAxCCQSEDECJRIQMQQhBBIQMQYqEhCjc2lnxEAhLNdfdDp9Wbi0YwsEQCpP7TVHbHG7y41F4MoESNW/vL1guS+5Wj4f5V9fmM63/VKTSMFidHOSwm5o+pbV5lYHo3R4boujYW10zROIpWNsb3NlxCDmmpYeby1feshmB5JlUr6YI17TM2PKiJGLuck4qRW2+aNmZWXOAAWq6qJmds0wOaJnaMQgf4OxZX/x/FO5LcGBSKHWXfwtSx+j1ncoSt3SABJtkGmjZ3JwxCCCVfqhCinRBXKMIq9eSrJQIXZ+7iXUTig91oGd/mZEAqJsds0wOqJseMQgf4OxZX/x/FO5LcGBSKHWXfwtSx+j1ncoSt3SABJtkGmjcmN2xCD+vKC7FEpaTqe0OKRoGsgObKEFvLYH/FZTJclWlfaiE6NzbmTEIIU9h0wnKapwajF0N7K4zy3orGLF+rQ8kLIk/vW6FhPvpHR5cGWjcGF5" 168 require.Equal(t, goldenStxns, base64.StdEncoding.EncodeToString(stxns)) 169 } 170 171 func TestLimitOrder(t *testing.T) { 172 // Inputs 173 owner := "726KBOYUJJNE5J5UHCSGQGWIBZWKCBN4WYD7YVSTEXEVNFPWUIJ7TAEOPM" 174 assetid := uint64(12345) 175 ratn, ratd := uint64(30), uint64(100) 176 expiryRound := uint64(123456) 177 minTrade := uint64(10000) 178 maxFee := uint64(5000000) 179 c, err := MakeLimitOrder(owner, assetid, ratn, ratd, expiryRound, minTrade, maxFee) 180 // Outputs 181 require.NoError(t, err) 182 goldenProgram := "ASAKAAHAlrECApBOBLlgZB7AxAcmASD+vKC7FEpaTqe0OKRoGsgObKEFvLYH/FZTJclWlfaiEzEWIhIxECMSEDEBJA4QMgQjEkAAVTIEJRIxCCEEDRAxCTIDEhAzARAhBRIQMwERIQYSEDMBFCgSEDMBEzIDEhAzARIhBx01AjUBMQghCB01BDUDNAE0Aw1AACQ0ATQDEjQCNAQPEEAAFgAxCSgSMQIhCQ0QMQcyAxIQMQgiEhAQ" 183 require.Equal(t, goldenProgram, base64.StdEncoding.EncodeToString(c.GetProgram())) 184 goldenAddress := "LXQWT2XLIVNFS54VTLR63UY5K6AMIEWI7YTVE6LB4RWZDBZKH22ZO3S36I" 185 require.Equal(t, goldenAddress, c.GetAddress()) 186 }