github.com/cryptohub-digital/blockbook-fork@v0.0.0-20230713133354-673c927af7f1/bchain/coins/xcb/contract_test.go (about) 1 package xcb 2 3 import ( 4 "math/big" 5 "reflect" 6 "testing" 7 8 "github.com/core-coin/go-core/v2/common" 9 "github.com/cryptohub-digital/blockbook-fork/bchain" 10 "github.com/cryptohub-digital/blockbook-fork/tests/dbtestdata" 11 ) 12 13 func TestCrc20_getTokenTransfersFromLog(t *testing.T) { 14 tests := []struct { 15 name string 16 args []*RpcLog 17 want bchain.TokenTransfers 18 wantErr bool 19 }{ 20 { 21 name: "1", 22 args: []*RpcLog{ 23 { 24 Address: "ab98e5e2ba00469ce51440c22d4d4b79a56da712297f", 25 Topics: []string{ 26 "0xc17a9d92b89f27cb79cc390f23a1a5d302fefab8c7911075ede952ac2b5607a1", 27 "0x00000000000000000000ab44de35413ee2b672d322938e2fcc932d5c0cf8ec88", 28 "0x00000000000000000000ab27b691efe91718cb73207207d92dbd175e6b10c756", 29 }, 30 Data: "0x000000000000000000000000000000000000000000000002b5e3af16b1880000", 31 }, 32 }, 33 want: bchain.TokenTransfers{ 34 { 35 Contract: "ab98e5e2ba00469ce51440c22d4d4b79a56da712297f", 36 From: "ab44de35413ee2b672d322938e2fcc932d5c0cf8ec88", 37 To: "ab27b691efe91718cb73207207d92dbd175e6b10c756", 38 Value: *big.NewInt(0).SetBytes([]byte{0x02, 0xB5, 0xE3, 0xAF, 0x16, 0xB1, 0x88, 0x00, 0x00}), 39 Type: bchain.FungibleToken, 40 }, 41 }, 42 }, 43 { 44 name: "2", 45 args: []*RpcLog{ 46 { // Transfer 47 Address: "ab788e6c1e3bb2174aa05358a903dd93b2f3d361e2b6", 48 Topics: []string{ 49 "0xc17a9d92b89f27cb79cc390f23a1a5d302fefab8c7911075ede952ac2b5607a1", 50 "0x00000000000000000000ab325f035d28ec052ea69198a1089064e9c4244eec3f", 51 "0x00000000000000000000ab8497b008b094d916aa63e60e1f4e626c7334c4eb62", 52 }, 53 Data: "0x000000000000000000000000000000000000000000000000000051c821a88000", 54 }, 55 { // Transfer 56 Address: "ab788e6c1e3bb2174aa05358a903dd93b2f3d361e2b6", 57 Topics: []string{ 58 "0xc17a9d92b89f27cb79cc390f23a1a5d302fefab8c7911075ede952ac2b5607a1", 59 "0x00000000000000000000ab06fc08a2b40a25883f2e91bca36db89a3dd79989ba", 60 "0x00000000000000000000ab8497b008b094d916aa63e60e1f4e626c7334c4eb62", 61 }, 62 Data: "0x0000000000000000000000000000000000000000000000000000a39043510000", 63 }, 64 { // not Transfer 65 Address: "ab8497b008b094d916aa63e60e1f4e626c7334c4eb62", 66 Topics: []string{ 67 "0xd5e9cd7af10b71d0052610468eba244b812851c4e582629a8e52faa2484c56aa", 68 "0x0000000000000000000000000000000000000000000000000000000000000021", 69 "0x00000000000000000000ab325f035d28ec052ea69198a1089064e9c4244eec3f", 70 "0x00000000000000000000ab06fc08a2b40a25883f2e91bca36db89a3dd79989ba", 71 }, 72 Data: "0x000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000024e1cc78e2b605b726e9da5c9d497c38f95567defbd1953c034596206560189adafe80b37d53a8b6b516635fa5588638169f062a55db158e70bc226f5f3fd5dff0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000028e410d44000000000000000000000000000000000000000000000000000000028e410d44000", 73 }, 74 { // not Transfer 75 Address: "ab788e6c1e3bb2174aa05358a903dd93b2f3d361e2b6", 76 Topics: []string{ 77 "0xafa504e0962ad93dec232a2c88581b4028671c11f4571f9edec54fb75bd7293d", 78 "0x00000000000000000000ab06fc08a2b40a25883f2e91bca36db89a3dd79989ba", 79 "0x00000000000000000000ab8497b008b094d916aa63e60e1f4e626c7334c4eb62", 80 }, 81 Data: "0x0000000000000000000000000000000000000000000000000000000000000000", 82 }, 83 }, 84 want: bchain.TokenTransfers{ 85 { 86 Contract: "ab788e6c1e3bb2174aa05358a903dd93b2f3d361e2b6", 87 From: "ab325f035d28ec052ea69198a1089064e9c4244eec3f", 88 To: "ab8497b008b094d916aa63e60e1f4e626c7334c4eb62", 89 Value: *big.NewInt(0).SetBytes([]byte{0x51, 0xc8, 0x21, 0xa8, 0x80, 0x00}), 90 Type: bchain.FungibleToken, 91 }, 92 { 93 Contract: "ab788e6c1e3bb2174aa05358a903dd93b2f3d361e2b6", 94 From: "ab06fc08a2b40a25883f2e91bca36db89a3dd79989ba", 95 To: "ab8497b008b094d916aa63e60e1f4e626c7334c4eb62", 96 Value: *big.NewInt(0).SetBytes([]byte{0xa3, 0x90, 0x43, 0x51, 0x00, 0x00}), 97 Type: bchain.FungibleToken, 98 }, 99 }, 100 }, 101 { 102 name: "2", 103 args: []*RpcLog{ 104 { // Transfer 105 Address: "ab98e5e2ba00469ce51440c22d4d4b79a56da712297f", 106 Topics: []string{ 107 "0xc17a9d92b89f27cb79cc390f23a1a5d302fefab8c7911075ede952ac2b5607a1", 108 "0x00000000000000000000ab228a4d4263e067df56b1dd226acb939f532ff7ab5b", 109 "0x00000000000000000000ab094a15c3dc43095c7450c59bf56263e9827065f306", 110 }, 111 Data: "0x0000000000000000000000000000000000000000000000000de0b6b3a7640000", 112 }, 113 }, 114 want: bchain.TokenTransfers{ 115 { 116 Contract: "ab98e5e2ba00469ce51440c22d4d4b79a56da712297f", 117 From: "ab228a4d4263e067df56b1dd226acb939f532ff7ab5b", 118 To: "ab094a15c3dc43095c7450c59bf56263e9827065f306", 119 Value: *big.NewInt(0).SetBytes([]byte{0x0D, 0xE0, 0xB6, 0xB3, 0xA7, 0x64, 0x00, 0x00}), 120 Type: bchain.FungibleToken, 121 }, 122 }, 123 }, 124 } 125 common.DefaultNetworkID = common.NetworkID(3) 126 for _, tt := range tests { 127 t.Run(tt.name, func(t *testing.T) { 128 got, err := getTokenTransfersFromLog(tt.args) 129 if (err != nil) != tt.wantErr { 130 t.Errorf("getTokenTransfersFromLog error = %v, wantErr %v", err, tt.wantErr) 131 return 132 } 133 134 // the addresses could have different case 135 if !reflect.DeepEqual(got, tt.want) { 136 t.Errorf("getTokenTransfersFromLog = %+v, want %+v", got, tt.want) 137 } 138 }) 139 } 140 } 141 142 func TestCrc20_parseCRC20StringProperty(t *testing.T) { 143 tests := []struct { 144 name string 145 args string 146 want string 147 }{ 148 { 149 name: "1", 150 args: "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000758504c4f44444500000000000000000000000000000000000000000000000000", 151 want: "XPLODDE", 152 }, 153 { 154 name: "2", 155 args: "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000022426974436c617665202d20436f6e73756d657220416374697669747920546f6b656e00000000000000", 156 want: "BitClave - Consumer Activity Token", 157 }, 158 { 159 name: "short", 160 args: "0x44616920537461626c65636f696e2076312e3000000000000000000000000000", 161 want: "Dai Stablecoin v1.0", 162 }, 163 { 164 name: "short2", 165 args: "0x44616920537461626c65636f696e2076312e3020444444444444444444444444", 166 want: "Dai Stablecoin v1.0 DDDDDDDDDDDD", 167 }, 168 { 169 name: "long", 170 args: "0x556e6973776170205631000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", 171 want: "Uniswap V1", 172 }, 173 { 174 name: "garbage", 175 args: "0x2234880850896048596206002535425366538144616734015984380565810000", 176 want: "", 177 }, 178 } 179 for _, tt := range tests { 180 t.Run(tt.name, func(t *testing.T) { 181 got := parseCRC20StringProperty(nil, tt.args) 182 // the addresses could have different case 183 if got != tt.want { 184 t.Errorf("parseCRC20StringProperty = %v, want %v", got, tt.want) 185 } 186 }) 187 } 188 } 189 190 func TestCrc20_getTokenTransfersFromTx(t *testing.T) { 191 common.DefaultNetworkID = common.NetworkID(3) 192 p := NewCoreCoinParser(1) 193 b := dbtestdata.GetTestCoreCoinTypeBlock1(p) 194 bn, _ := new(big.Int).SetString("1000000000000000000", 10) 195 tests := []struct { 196 name string 197 args *RpcTransaction 198 want bchain.TokenTransfers 199 }{ 200 { 201 name: "0", 202 args: (b.Txs[0].CoinSpecificData.(CoreCoinSpecificData)).Tx, 203 want: bchain.TokenTransfers{}, 204 }, 205 { 206 name: "1", 207 args: (b.Txs[1].CoinSpecificData.(CoreCoinSpecificData)).Tx, 208 want: bchain.TokenTransfers{ 209 { 210 Contract: "ab98e5e2ba00469ce51440c22d4d4b79a56da712297f", 211 From: "ab228a4d4263e067df56b1dd226acb939f532ff7ab5b", 212 To: "ab094a15c3dc43095c7450c59bf56263e9827065f306", 213 Value: *bn, 214 Type: bchain.FungibleToken, 215 }, 216 }, 217 }, 218 } 219 for _, tt := range tests { 220 t.Run(tt.name, func(t *testing.T) { 221 got, err := getTokenTransfersFromTx(tt.args) 222 if err != nil { 223 t.Errorf("getTokenTransfersFromTx error = %v", err) 224 return 225 } 226 // the addresses could have different case 227 if len(got) > 0 && len(tt.want) > 0 && !reflect.DeepEqual(got, tt.want) { 228 t.Errorf("getTokenTransfersFromTx = %+v, want %+v", got, tt.want) 229 } 230 }) 231 } 232 }