Skip to content

Commit d6a38ad

Browse files
committed
refactor(core): extract historical balance bypass rules
Move the historical balance bypass table and application logic out of state_processor.go into a dedicated file. Keep the state processing flow focused without changing the bypass behavior, and add focused tests for matching and non-matching historical rules.
1 parent f5fe86c commit d6a38ad

3 files changed

Lines changed: 195 additions & 144 deletions

File tree

core/state_processor.go

Lines changed: 1 addition & 144 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import (
2222
"fmt"
2323
"math/big"
2424
"runtime"
25-
"strings"
2625
"sync"
2726

2827
"github.com/XinFinOrg/XDPoSChain/XDCx/tradingstate"
@@ -313,149 +312,7 @@ func ApplyTransactionWithEVM(msg *Message, gp *GasPool, statedb *state.StateDB,
313312
txContext := NewEVMTxContext(msg)
314313
evm.SetTxContext(txContext)
315314

316-
// Bypass denylist address
317-
maxBlockNumber := new(big.Int).SetInt64(9147459)
318-
if blockNumber.Cmp(maxBlockNumber) <= 0 {
319-
addrMap := make(map[string]string)
320-
addrMap["0x5248bfb72fd4f234e062d3e9bb76f08643004fcd"] = "29410"
321-
addrMap["0x5ac26105b35ea8935be382863a70281ec7a985e9"] = "23551"
322-
addrMap["0x09c4f991a41e7ca0645d7dfbfee160b55e562ea4"] = "25821"
323-
addrMap["0xb3157bbc5b401a45d6f60b106728bb82ebaa585b"] = "20051"
324-
addrMap["0x741277a8952128d5c2ffe0550f5001e4c8247674"] = "23937"
325-
addrMap["0x10ba49c1caa97d74b22b3e74493032b180cebe01"] = "27320"
326-
addrMap["0x07048d51d9e6179578a6e3b9ee28cdc183b865e4"] = "29758"
327-
addrMap["0x4b899001d73c7b4ec404a771d37d9be13b8983de"] = "26148"
328-
addrMap["0x85cb320a9007f26b7652c19a2a65db1da2d0016f"] = "27216"
329-
addrMap["0x06869dbd0e3a2ea37ddef832e20fa005c6f0ca39"] = "29449"
330-
addrMap["0x82e48bc7e2c93d89125428578fb405947764ad7c"] = "28084"
331-
addrMap["0x1f9a78534d61732367cbb43fc6c89266af67c989"] = "29287"
332-
addrMap["0x7c3b1fa91df55ff7af0cad9e0399384dc5c6641b"] = "21574"
333-
addrMap["0x5888dc1ceb0ff632713486b9418e59743af0fd20"] = "28836"
334-
addrMap["0xa512fa1c735fc3cc635624d591dd9ea1ce339ca5"] = "25515"
335-
addrMap["0x0832517654c7b7e36b1ef45d76de70326b09e2c7"] = "22873"
336-
addrMap["0xca14e3c4c78bafb60819a78ff6e6f0f709d2aea7"] = "24968"
337-
addrMap["0x652ce195a23035114849f7642b0e06647d13e57a"] = "24091"
338-
addrMap["0x29a79f00f16900999d61b6e171e44596af4fb5ae"] = "20790"
339-
addrMap["0xf9fd1c2b0af0d91b0b6754e55639e3f8478dd04a"] = "23331"
340-
addrMap["0xb835710c9901d5fe940ef1b99ed918902e293e35"] = "28273"
341-
addrMap["0x04dd29ce5c253377a9a3796103ea0d9a9e514153"] = "29956"
342-
addrMap["0x2b4b56846eaf05c1fd762b5e1ac802efd0ab871c"] = "24911"
343-
addrMap["0x1d1f909f6600b23ce05004f5500ab98564717996"] = "25637"
344-
addrMap["0x0dfdcebf80006dc9ab7aae8c216b51c6b6759e86"] = "26378"
345-
addrMap["0x2b373890a28e5e46197fbc04f303bbfdd344056f"] = "21109"
346-
addrMap["0xa8a3ef3dc5d8e36aee76f3671ec501ec31e28254"] = "22072"
347-
addrMap["0x4f3d18136fe2b5665c29bdaf74591fc6625ef427"] = "21650"
348-
addrMap["0x175d728b0e0f1facb5822a2e0c03bde93596e324"] = "21588"
349-
addrMap["0xd575c2611984fcd79513b80ab94f59dc5bab4916"] = "28971"
350-
addrMap["0x0579337873c97c4ba051310236ea847f5be41bc0"] = "28344"
351-
addrMap["0xed12a519cc15b286920fc15fd86106b3e6a16218"] = "24443"
352-
addrMap["0x492d26d852a0a0a2982bb40ec86fe394488c419e"] = "26623"
353-
addrMap["0xce5c7635d02dc4e1d6b46c256cae6323be294a32"] = "28459"
354-
addrMap["0x8b94db158b5e78a6c032c7e7c9423dec62c8b11c"] = "21803"
355-
addrMap["0x0e7c48c085b6b0aa7ca6e4cbcc8b9a92dc270eb4"] = "21739"
356-
addrMap["0x206e6508462033ef8425edc6c10789d241d49acb"] = "21883"
357-
addrMap["0x7710e7b7682f26cb5a1202e1cff094fbf7777758"] = "28907"
358-
addrMap["0xcb06f949313b46bbf53b8e6b2868a0c260ff9385"] = "28932"
359-
addrMap["0xf884e43533f61dc2997c0e19a6eff33481920c00"] = "27780"
360-
addrMap["0x8b635ef2e4c8fe21fc2bda027eb5f371d6aa2fc1"] = "23115"
361-
addrMap["0x10f01a27cf9b29d02ce53497312b96037357a361"] = "22716"
362-
addrMap["0x693dd49b0ed70f162d733cf20b6c43dc2a2b4d95"] = "20020"
363-
addrMap["0xe0bec72d1c2a7a7fb0532cdfac44ebab9f6f41ee"] = "23071"
364-
addrMap["0xc8793633a537938cb49cdbbffd45428f10e45b64"] = "24652"
365-
addrMap["0x0d07a6cbbe9fa5c4f154e5623bfe47fb4d857d8e"] = "21907"
366-
addrMap["0xd4080b289da95f70a586610c38268d8d4cf1e4c4"] = "22719"
367-
addrMap["0x8bcfb0caf41f0aa1b548cae76dcdd02e33866a1b"] = "29062"
368-
addrMap["0xabfef22b92366d3074676e77ea911ccaabfb64c1"] = "23110"
369-
addrMap["0xcc4df7a32faf3efba32c9688def5ccf9fefe443d"] = "21397"
370-
addrMap["0x7ec1e48a582475f5f2b7448a86c4ea7a26ea36f8"] = "23105"
371-
addrMap["0xe3de67289080f63b0c2612844256a25bb99ac0ad"] = "29721"
372-
addrMap["0x3ba623300cf9e48729039b3c9e0dee9b785d636e"] = "25917"
373-
addrMap["0x402f2cfc9c8942f5e7a12c70c625d07a5d52fe29"] = "24712"
374-
addrMap["0xd62358d42afbde095a4ca868581d85f9adcc3d61"] = "24449"
375-
addrMap["0x3969f86acb733526cd61e3c6e3b4660589f32bc6"] = "29579"
376-
addrMap["0x67615413d7cdadb2c435a946aec713a9a9794d39"] = "26333"
377-
addrMap["0xfe685f43acc62f92ab01a8da80d76455d39d3cb3"] = "29825"
378-
addrMap["0x3538a544021c07869c16b764424c5987409cba48"] = "22746"
379-
addrMap["0xe187cf86c2274b1f16e8225a7da9a75aba4f1f5f"] = "23734"
380-
381-
blockMap := make(map[int64]string)
382-
383-
blockMap[9073579] = "0x5248bfb72fd4f234e062d3e9bb76f08643004fcd"
384-
blockMap[9147130] = "0x5ac26105b35ea8935be382863a70281ec7a985e9"
385-
blockMap[9147195] = "0x09c4f991a41e7ca0645d7dfbfee160b55e562ea4"
386-
blockMap[9147200] = "0xb3157bbc5b401a45d6f60b106728bb82ebaa585b"
387-
blockMap[9147206] = "0x741277a8952128d5c2ffe0550f5001e4c8247674"
388-
blockMap[9147212] = "0x10ba49c1caa97d74b22b3e74493032b180cebe01"
389-
blockMap[9147217] = "0x07048d51d9e6179578a6e3b9ee28cdc183b865e4"
390-
blockMap[9147223] = "0x4b899001d73c7b4ec404a771d37d9be13b8983de"
391-
blockMap[9147229] = "0x85cb320a9007f26b7652c19a2a65db1da2d0016f"
392-
blockMap[9147234] = "0x06869dbd0e3a2ea37ddef832e20fa005c6f0ca39"
393-
blockMap[9147240] = "0x82e48bc7e2c93d89125428578fb405947764ad7c"
394-
blockMap[9147246] = "0x1f9a78534d61732367cbb43fc6c89266af67c989"
395-
blockMap[9147251] = "0x7c3b1fa91df55ff7af0cad9e0399384dc5c6641b"
396-
blockMap[9147257] = "0x5888dc1ceb0ff632713486b9418e59743af0fd20"
397-
blockMap[9147263] = "0xa512fa1c735fc3cc635624d591dd9ea1ce339ca5"
398-
blockMap[9147268] = "0x0832517654c7b7e36b1ef45d76de70326b09e2c7"
399-
blockMap[9147274] = "0xca14e3c4c78bafb60819a78ff6e6f0f709d2aea7"
400-
blockMap[9147279] = "0x652ce195a23035114849f7642b0e06647d13e57a"
401-
blockMap[9147285] = "0x29a79f00f16900999d61b6e171e44596af4fb5ae"
402-
blockMap[9147291] = "0xf9fd1c2b0af0d91b0b6754e55639e3f8478dd04a"
403-
blockMap[9147296] = "0xb835710c9901d5fe940ef1b99ed918902e293e35"
404-
blockMap[9147302] = "0x04dd29ce5c253377a9a3796103ea0d9a9e514153"
405-
blockMap[9147308] = "0x2b4b56846eaf05c1fd762b5e1ac802efd0ab871c"
406-
blockMap[9147314] = "0x1d1f909f6600b23ce05004f5500ab98564717996"
407-
blockMap[9147319] = "0x0dfdcebf80006dc9ab7aae8c216b51c6b6759e86"
408-
blockMap[9147325] = "0x2b373890a28e5e46197fbc04f303bbfdd344056f"
409-
blockMap[9147330] = "0xa8a3ef3dc5d8e36aee76f3671ec501ec31e28254"
410-
blockMap[9147336] = "0x4f3d18136fe2b5665c29bdaf74591fc6625ef427"
411-
blockMap[9147342] = "0x175d728b0e0f1facb5822a2e0c03bde93596e324"
412-
blockMap[9145281] = "0xd575c2611984fcd79513b80ab94f59dc5bab4916"
413-
blockMap[9145315] = "0x0579337873c97c4ba051310236ea847f5be41bc0"
414-
blockMap[9145341] = "0xed12a519cc15b286920fc15fd86106b3e6a16218"
415-
blockMap[9145367] = "0x492d26d852a0a0a2982bb40ec86fe394488c419e"
416-
blockMap[9145386] = "0xce5c7635d02dc4e1d6b46c256cae6323be294a32"
417-
blockMap[9145414] = "0x8b94db158b5e78a6c032c7e7c9423dec62c8b11c"
418-
blockMap[9145436] = "0x0e7c48c085b6b0aa7ca6e4cbcc8b9a92dc270eb4"
419-
blockMap[9145463] = "0x206e6508462033ef8425edc6c10789d241d49acb"
420-
blockMap[9145493] = "0x7710e7b7682f26cb5a1202e1cff094fbf7777758"
421-
blockMap[9145519] = "0xcb06f949313b46bbf53b8e6b2868a0c260ff9385"
422-
blockMap[9145549] = "0xf884e43533f61dc2997c0e19a6eff33481920c00"
423-
blockMap[9147352] = "0x8b635ef2e4c8fe21fc2bda027eb5f371d6aa2fc1"
424-
blockMap[9147357] = "0x10f01a27cf9b29d02ce53497312b96037357a361"
425-
blockMap[9147363] = "0x693dd49b0ed70f162d733cf20b6c43dc2a2b4d95"
426-
blockMap[9147369] = "0xe0bec72d1c2a7a7fb0532cdfac44ebab9f6f41ee"
427-
blockMap[9147375] = "0xc8793633a537938cb49cdbbffd45428f10e45b64"
428-
blockMap[9147380] = "0x0d07a6cbbe9fa5c4f154e5623bfe47fb4d857d8e"
429-
blockMap[9147386] = "0xd4080b289da95f70a586610c38268d8d4cf1e4c4"
430-
blockMap[9147392] = "0x8bcfb0caf41f0aa1b548cae76dcdd02e33866a1b"
431-
blockMap[9147397] = "0xabfef22b92366d3074676e77ea911ccaabfb64c1"
432-
blockMap[9147403] = "0xcc4df7a32faf3efba32c9688def5ccf9fefe443d"
433-
blockMap[9147408] = "0x7ec1e48a582475f5f2b7448a86c4ea7a26ea36f8"
434-
blockMap[9147414] = "0xe3de67289080f63b0c2612844256a25bb99ac0ad"
435-
blockMap[9147420] = "0x3ba623300cf9e48729039b3c9e0dee9b785d636e"
436-
blockMap[9147425] = "0x402f2cfc9c8942f5e7a12c70c625d07a5d52fe29"
437-
blockMap[9147431] = "0xd62358d42afbde095a4ca868581d85f9adcc3d61"
438-
blockMap[9147437] = "0x3969f86acb733526cd61e3c6e3b4660589f32bc6"
439-
blockMap[9147442] = "0x67615413d7cdadb2c435a946aec713a9a9794d39"
440-
blockMap[9147448] = "0xfe685f43acc62f92ab01a8da80d76455d39d3cb3"
441-
blockMap[9147453] = "0x3538a544021c07869c16b764424c5987409cba48"
442-
blockMap[9147459] = "0xe187cf86c2274b1f16e8225a7da9a75aba4f1f5f"
443-
444-
addrFrom := msg.From.Hex()
445-
446-
currentBlockNumber := blockNumber.Int64()
447-
if addr, ok := blockMap[currentBlockNumber]; ok {
448-
if strings.EqualFold(addr, addrFrom) { // case insensitive
449-
bal := addrMap[addr]
450-
hBalance := new(big.Int)
451-
hBalance.SetString(bal+"000000000000000000", 10)
452-
log.Info("address", addr, "with_balance", bal, "XDC")
453-
addrBin := common.HexToAddress(addr)
454-
statedb.SetBalance(addrBin, hBalance, tracing.BalanceChangeUnspecified)
455-
}
456-
}
457-
}
458-
// End Bypass denylist address
315+
applyHistoricalBalanceBypass(statedb, blockNumber, msg.From)
459316

460317
// Apply the transaction to the current state (included in the env)
461318
result, err := ApplyMessage(evm, msg, gp, coinbaseOwner)
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package core
2+
3+
import (
4+
"math/big"
5+
6+
"github.com/XinFinOrg/XDPoSChain/common"
7+
"github.com/XinFinOrg/XDPoSChain/core/state"
8+
"github.com/XinFinOrg/XDPoSChain/core/tracing"
9+
"github.com/XinFinOrg/XDPoSChain/log"
10+
"github.com/XinFinOrg/XDPoSChain/params"
11+
)
12+
13+
const maxHistoricalBalanceBypassBlock uint64 = 9147459
14+
15+
type historicalBalanceBypass struct {
16+
addr common.Address
17+
balance *big.Int
18+
}
19+
20+
var historicalBalanceBypassByBlock = map[uint64]historicalBalanceBypass{
21+
9073579: {addr: common.HexToAddress("0x5248bfb72fd4f234e062d3e9bb76f08643004fcd"), balance: toXdcAmount(29410)},
22+
9147130: {addr: common.HexToAddress("0x5ac26105b35ea8935be382863a70281ec7a985e9"), balance: toXdcAmount(23551)},
23+
9147195: {addr: common.HexToAddress("0x09c4f991a41e7ca0645d7dfbfee160b55e562ea4"), balance: toXdcAmount(25821)},
24+
9147200: {addr: common.HexToAddress("0xb3157bbc5b401a45d6f60b106728bb82ebaa585b"), balance: toXdcAmount(20051)},
25+
9147206: {addr: common.HexToAddress("0x741277a8952128d5c2ffe0550f5001e4c8247674"), balance: toXdcAmount(23937)},
26+
9147212: {addr: common.HexToAddress("0x10ba49c1caa97d74b22b3e74493032b180cebe01"), balance: toXdcAmount(27320)},
27+
9147217: {addr: common.HexToAddress("0x07048d51d9e6179578a6e3b9ee28cdc183b865e4"), balance: toXdcAmount(29758)},
28+
9147223: {addr: common.HexToAddress("0x4b899001d73c7b4ec404a771d37d9be13b8983de"), balance: toXdcAmount(26148)},
29+
9147229: {addr: common.HexToAddress("0x85cb320a9007f26b7652c19a2a65db1da2d0016f"), balance: toXdcAmount(27216)},
30+
9147234: {addr: common.HexToAddress("0x06869dbd0e3a2ea37ddef832e20fa005c6f0ca39"), balance: toXdcAmount(29449)},
31+
9147240: {addr: common.HexToAddress("0x82e48bc7e2c93d89125428578fb405947764ad7c"), balance: toXdcAmount(28084)},
32+
9147246: {addr: common.HexToAddress("0x1f9a78534d61732367cbb43fc6c89266af67c989"), balance: toXdcAmount(29287)},
33+
9147251: {addr: common.HexToAddress("0x7c3b1fa91df55ff7af0cad9e0399384dc5c6641b"), balance: toXdcAmount(21574)},
34+
9147257: {addr: common.HexToAddress("0x5888dc1ceb0ff632713486b9418e59743af0fd20"), balance: toXdcAmount(28836)},
35+
9147263: {addr: common.HexToAddress("0xa512fa1c735fc3cc635624d591dd9ea1ce339ca5"), balance: toXdcAmount(25515)},
36+
9147268: {addr: common.HexToAddress("0x0832517654c7b7e36b1ef45d76de70326b09e2c7"), balance: toXdcAmount(22873)},
37+
9147274: {addr: common.HexToAddress("0xca14e3c4c78bafb60819a78ff6e6f0f709d2aea7"), balance: toXdcAmount(24968)},
38+
9147279: {addr: common.HexToAddress("0x652ce195a23035114849f7642b0e06647d13e57a"), balance: toXdcAmount(24091)},
39+
9147285: {addr: common.HexToAddress("0x29a79f00f16900999d61b6e171e44596af4fb5ae"), balance: toXdcAmount(20790)},
40+
9147291: {addr: common.HexToAddress("0xf9fd1c2b0af0d91b0b6754e55639e3f8478dd04a"), balance: toXdcAmount(23331)},
41+
9147296: {addr: common.HexToAddress("0xb835710c9901d5fe940ef1b99ed918902e293e35"), balance: toXdcAmount(28273)},
42+
9147302: {addr: common.HexToAddress("0x04dd29ce5c253377a9a3796103ea0d9a9e514153"), balance: toXdcAmount(29956)},
43+
9147308: {addr: common.HexToAddress("0x2b4b56846eaf05c1fd762b5e1ac802efd0ab871c"), balance: toXdcAmount(24911)},
44+
9147314: {addr: common.HexToAddress("0x1d1f909f6600b23ce05004f5500ab98564717996"), balance: toXdcAmount(25637)},
45+
9147319: {addr: common.HexToAddress("0x0dfdcebf80006dc9ab7aae8c216b51c6b6759e86"), balance: toXdcAmount(26378)},
46+
9147325: {addr: common.HexToAddress("0x2b373890a28e5e46197fbc04f303bbfdd344056f"), balance: toXdcAmount(21109)},
47+
9147330: {addr: common.HexToAddress("0xa8a3ef3dc5d8e36aee76f3671ec501ec31e28254"), balance: toXdcAmount(22072)},
48+
9147336: {addr: common.HexToAddress("0x4f3d18136fe2b5665c29bdaf74591fc6625ef427"), balance: toXdcAmount(21650)},
49+
9147342: {addr: common.HexToAddress("0x175d728b0e0f1facb5822a2e0c03bde93596e324"), balance: toXdcAmount(21588)},
50+
9145281: {addr: common.HexToAddress("0xd575c2611984fcd79513b80ab94f59dc5bab4916"), balance: toXdcAmount(28971)},
51+
9145315: {addr: common.HexToAddress("0x0579337873c97c4ba051310236ea847f5be41bc0"), balance: toXdcAmount(28344)},
52+
9145341: {addr: common.HexToAddress("0xed12a519cc15b286920fc15fd86106b3e6a16218"), balance: toXdcAmount(24443)},
53+
9145367: {addr: common.HexToAddress("0x492d26d852a0a0a2982bb40ec86fe394488c419e"), balance: toXdcAmount(26623)},
54+
9145386: {addr: common.HexToAddress("0xce5c7635d02dc4e1d6b46c256cae6323be294a32"), balance: toXdcAmount(28459)},
55+
9145414: {addr: common.HexToAddress("0x8b94db158b5e78a6c032c7e7c9423dec62c8b11c"), balance: toXdcAmount(21803)},
56+
9145436: {addr: common.HexToAddress("0x0e7c48c085b6b0aa7ca6e4cbcc8b9a92dc270eb4"), balance: toXdcAmount(21739)},
57+
9145463: {addr: common.HexToAddress("0x206e6508462033ef8425edc6c10789d241d49acb"), balance: toXdcAmount(21883)},
58+
9145493: {addr: common.HexToAddress("0x7710e7b7682f26cb5a1202e1cff094fbf7777758"), balance: toXdcAmount(28907)},
59+
9145519: {addr: common.HexToAddress("0xcb06f949313b46bbf53b8e6b2868a0c260ff9385"), balance: toXdcAmount(28932)},
60+
9145549: {addr: common.HexToAddress("0xf884e43533f61dc2997c0e19a6eff33481920c00"), balance: toXdcAmount(27780)},
61+
9147352: {addr: common.HexToAddress("0x8b635ef2e4c8fe21fc2bda027eb5f371d6aa2fc1"), balance: toXdcAmount(23115)},
62+
9147357: {addr: common.HexToAddress("0x10f01a27cf9b29d02ce53497312b96037357a361"), balance: toXdcAmount(22716)},
63+
9147363: {addr: common.HexToAddress("0x693dd49b0ed70f162d733cf20b6c43dc2a2b4d95"), balance: toXdcAmount(20020)},
64+
9147369: {addr: common.HexToAddress("0xe0bec72d1c2a7a7fb0532cdfac44ebab9f6f41ee"), balance: toXdcAmount(23071)},
65+
9147375: {addr: common.HexToAddress("0xc8793633a537938cb49cdbbffd45428f10e45b64"), balance: toXdcAmount(24652)},
66+
9147380: {addr: common.HexToAddress("0x0d07a6cbbe9fa5c4f154e5623bfe47fb4d857d8e"), balance: toXdcAmount(21907)},
67+
9147386: {addr: common.HexToAddress("0xd4080b289da95f70a586610c38268d8d4cf1e4c4"), balance: toXdcAmount(22719)},
68+
9147392: {addr: common.HexToAddress("0x8bcfb0caf41f0aa1b548cae76dcdd02e33866a1b"), balance: toXdcAmount(29062)},
69+
9147397: {addr: common.HexToAddress("0xabfef22b92366d3074676e77ea911ccaabfb64c1"), balance: toXdcAmount(23110)},
70+
9147403: {addr: common.HexToAddress("0xcc4df7a32faf3efba32c9688def5ccf9fefe443d"), balance: toXdcAmount(21397)},
71+
9147408: {addr: common.HexToAddress("0x7ec1e48a582475f5f2b7448a86c4ea7a26ea36f8"), balance: toXdcAmount(23105)},
72+
9147414: {addr: common.HexToAddress("0xe3de67289080f63b0c2612844256a25bb99ac0ad"), balance: toXdcAmount(29721)},
73+
9147420: {addr: common.HexToAddress("0x3ba623300cf9e48729039b3c9e0dee9b785d636e"), balance: toXdcAmount(25917)},
74+
9147425: {addr: common.HexToAddress("0x402f2cfc9c8942f5e7a12c70c625d07a5d52fe29"), balance: toXdcAmount(24712)},
75+
9147431: {addr: common.HexToAddress("0xd62358d42afbde095a4ca868581d85f9adcc3d61"), balance: toXdcAmount(24449)},
76+
9147437: {addr: common.HexToAddress("0x3969f86acb733526cd61e3c6e3b4660589f32bc6"), balance: toXdcAmount(29579)},
77+
9147442: {addr: common.HexToAddress("0x67615413d7cdadb2c435a946aec713a9a9794d39"), balance: toXdcAmount(26333)},
78+
9147448: {addr: common.HexToAddress("0xfe685f43acc62f92ab01a8da80d76455d39d3cb3"), balance: toXdcAmount(29825)},
79+
9147453: {addr: common.HexToAddress("0x3538a544021c07869c16b764424c5987409cba48"), balance: toXdcAmount(22746)},
80+
9147459: {addr: common.HexToAddress("0xe187cf86c2274b1f16e8225a7da9a75aba4f1f5f"), balance: toXdcAmount(23734)},
81+
}
82+
83+
func toXdcAmount(amount uint64) *big.Int {
84+
return new(big.Int).Mul(new(big.Int).SetUint64(amount), big.NewInt(params.Ether))
85+
}
86+
87+
func applyHistoricalBalanceBypass(statedb *state.StateDB, blockNumber *big.Int, from common.Address) {
88+
if blockNumber == nil || !blockNumber.IsUint64() {
89+
return
90+
}
91+
number := blockNumber.Uint64()
92+
if number > maxHistoricalBalanceBypassBlock {
93+
return
94+
}
95+
rule, ok := historicalBalanceBypassByBlock[number]
96+
if !ok || rule.addr != from {
97+
return
98+
}
99+
log.Info("Apply historical balance bypass", "address", rule.addr, "balance", rule.balance, "unit", "wei")
100+
statedb.SetBalance(rule.addr, new(big.Int).Set(rule.balance), tracing.BalanceChangeUnspecified)
101+
}
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package core
2+
3+
import (
4+
"math/big"
5+
"sort"
6+
"testing"
7+
8+
"github.com/XinFinOrg/XDPoSChain/common"
9+
"github.com/XinFinOrg/XDPoSChain/core/rawdb"
10+
"github.com/XinFinOrg/XDPoSChain/core/state"
11+
"github.com/XinFinOrg/XDPoSChain/core/tracing"
12+
"github.com/XinFinOrg/XDPoSChain/core/types"
13+
"github.com/XinFinOrg/XDPoSChain/ethdb/memorydb"
14+
)
15+
16+
func newHistoricalBypassStateDB(t *testing.T) *state.StateDB {
17+
t.Helper()
18+
19+
statedb, err := state.New(types.EmptyRootHash, state.NewDatabase(rawdb.NewDatabase(memorydb.New())))
20+
if err != nil {
21+
t.Fatalf("failed to create state db: %v", err)
22+
}
23+
return statedb
24+
}
25+
26+
func TestHistoricalBalanceBypassApply(t *testing.T) {
27+
blocks := make([]uint64, 0, len(historicalBalanceBypassByBlock))
28+
for block := range historicalBalanceBypassByBlock {
29+
blocks = append(blocks, block)
30+
}
31+
sort.Slice(blocks, func(i, j int) bool {
32+
return blocks[i] < blocks[j]
33+
})
34+
35+
for _, block := range blocks {
36+
block := block
37+
t.Run(new(big.Int).SetUint64(block).String(), func(t *testing.T) {
38+
statedb := newHistoricalBypassStateDB(t)
39+
rule := historicalBalanceBypassByBlock[block]
40+
41+
statedb.SetBalance(rule.addr, big.NewInt(1), tracing.BalanceChangeUnspecified)
42+
applyHistoricalBalanceBypass(statedb, new(big.Int).SetUint64(block), rule.addr)
43+
44+
if have := statedb.GetBalance(rule.addr); have.Cmp(rule.balance) != 0 {
45+
t.Fatalf("wrong balance after bypass: have %v want %v", have, rule.balance)
46+
}
47+
})
48+
}
49+
}
50+
51+
func TestHistoricalBalanceBypassSkip(t *testing.T) {
52+
tests := []struct {
53+
name string
54+
blockNumber *big.Int
55+
from common.Address
56+
}{
57+
{
58+
name: "nil block number",
59+
blockNumber: nil,
60+
from: historicalBalanceBypassByBlock[9073579].addr,
61+
},
62+
{
63+
name: "block above max",
64+
blockNumber: new(big.Int).SetUint64(maxHistoricalBalanceBypassBlock + 1),
65+
from: historicalBalanceBypassByBlock[9073579].addr,
66+
},
67+
{
68+
name: "block without rule",
69+
blockNumber: big.NewInt(1),
70+
from: historicalBalanceBypassByBlock[9073579].addr,
71+
},
72+
{
73+
name: "address mismatch",
74+
blockNumber: big.NewInt(9073579),
75+
from: common.HexToAddress("0x1111111111111111111111111111111111111111"),
76+
},
77+
}
78+
79+
for _, tt := range tests {
80+
t.Run(tt.name, func(t *testing.T) {
81+
statedb := newHistoricalBypassStateDB(t)
82+
rule := historicalBalanceBypassByBlock[9073579]
83+
original := big.NewInt(7)
84+
85+
statedb.SetBalance(rule.addr, new(big.Int).Set(original), tracing.BalanceChangeUnspecified)
86+
applyHistoricalBalanceBypass(statedb, tt.blockNumber, tt.from)
87+
88+
if have := statedb.GetBalance(rule.addr); have.Cmp(original) != 0 {
89+
t.Fatalf("balance changed unexpectedly: have %v want %v", have, original)
90+
}
91+
})
92+
}
93+
}

0 commit comments

Comments
 (0)