@@ -24,6 +24,7 @@ class Address extends _BcThing.BcThing {
24
24
this . name = nName ;
25
25
this . isNative = ! ! nName ;
26
26
this . dbData = undefined ;
27
+ this . blockCode = undefined ;
27
28
this . tx = tx ;
28
29
this . data = createAddressData ( this ) ;
29
30
this . setBlock ( block ) ;
@@ -56,36 +57,46 @@ class Address extends _BcThing.BcThing {
56
57
57
58
async getCode ( ) {
58
59
try {
59
- if ( this . isZeroAddress || this . isNative ) return null ;
60
- let { code } = this . getData ( ) ;
61
- let { nod3, address, blockNumber } = this ;
62
- if ( code !== undefined ) return code ;
63
- code = await nod3 . eth . getCode ( address , blockNumber ) ;
64
- code = ( 0 , _utils . isNullData ) ( code ) ? null : code ;
65
- this . setData ( { code } ) ;
66
- return code ;
60
+ if ( this . isZeroAddress || this . isNative ) {
61
+ this . blockCode = null ;
62
+ }
63
+ let { nod3, address, blockNumber, blockCode } = this ;
64
+ if ( blockCode !== undefined ) return blockCode ;
65
+ blockCode = await nod3 . eth . getCode ( address , blockNumber ) ;
66
+ blockCode = ( 0 , _utils . isNullData ) ( blockCode ) ? null : blockCode ;
67
+ this . blockCode = blockCode ;
68
+ return blockCode ;
67
69
} catch ( err ) {
68
70
return Promise . reject ( err ) ;
69
71
}
70
72
}
71
73
74
+ saveCode ( ) {
75
+ let { code } = this . getData ( ) ;
76
+ if ( code ) return ;
77
+ let { blockCode } = this ;
78
+ if ( ! blockCode ) return ;
79
+ code = blockCode ;
80
+ let codeStoredAtBlock = this . blockNumber ;
81
+ this . setData ( { code, codeStoredAtBlock } ) ;
82
+ }
83
+
72
84
async fetch ( forceFetch ) {
73
85
try {
74
86
if ( this . fetched && ! forceFetch ) return this . getData ( true ) ;
75
- this . fetched = false ;
76
87
let dbData = this . isZeroAddress ? { } : await this . getFromDb ( ) ;
77
88
this . setData ( dbData ) ;
78
89
79
90
let { blockNumber } = this ;
80
91
81
92
let storedBlock = this . data . blockNumber || 0 ;
82
- if ( blockNumber >= storedBlock ) {
93
+ if ( storedBlock <= blockNumber ) {
83
94
let balance = await this . getBalance ( 'latest' ) ;
84
95
this . setData ( { balance, blockNumber } ) ;
85
96
}
86
97
87
98
let code = await this . getCode ( ) ;
88
- // TODO suicide
99
+ this . saveCode ( ) ;
89
100
if ( code ) {
90
101
// get contract info
91
102
let deployedCode = dbData ? dbData [ _types . fields . DEPLOYED_CODE ] : undefined ;
@@ -101,8 +112,11 @@ class Address extends _BcThing.BcThing {
101
112
data [ _types . fields . DEPLOYED_CODE ] = deployedCode ;
102
113
this . setData ( data ) ;
103
114
}
104
- this . makeContract ( deployedCode , dbData ) ;
115
+ this . makeContract ( deployedCode ) ;
105
116
let contractData = await this . contract . fetch ( ) ;
117
+ // prevent update this fields from contractData
118
+ delete contractData . balance ;
119
+ delete contractData . blockNumber ;
106
120
this . setData ( contractData ) ;
107
121
}
108
122
if ( this . isNative ) this . makeContract ( ) ;
@@ -187,15 +201,15 @@ class Address extends _BcThing.BcThing {
187
201
}
188
202
189
203
isContract ( ) {
190
- let { code, type } = this . getData ( ) ;
191
- let { isNative, address } = this ;
192
- if ( undefined === code && ! isNative && ! ( 0 , _rskUtils . isZeroAddress ) ( address ) ) {
204
+ let { address, blockCode } = this ;
205
+ if ( undefined === blockCode ) {
193
206
throw new Error ( `Run getCode first ${ address } ` ) ;
194
207
}
195
- return type === _types . addrTypes . CONTRACT ;
208
+ return ! ! blockCode ;
196
209
}
197
210
198
- makeContract ( deployedCode , dbData ) {
211
+ makeContract ( deployedCode ) {
212
+ const dbData = Object . assign ( { } , this . getData ( true ) ) ;
199
213
if ( this . contract ) return this . contract ;
200
214
let { address, nod3, initConfig, collections, block } = this ;
201
215
this . contract = new _Contract . default ( address , deployedCode , { dbData, nod3, initConfig, collections, block } ) ;
@@ -208,6 +222,12 @@ class Address extends _BcThing.BcThing {
208
222
} catch ( err ) {
209
223
return Promise . reject ( err ) ;
210
224
}
225
+ }
226
+
227
+ suicide ( destroyedBy ) {
228
+ let data = { } ;
229
+ data [ _types . fields . DESTROYED_BY ] = destroyedBy ;
230
+ this . setData ( data ) ;
211
231
} } exports . Address = Address ;
212
232
213
233
@@ -239,13 +259,20 @@ function createAddressData({ address, isNative, name }) {
239
259
switch ( prop ) {
240
260
case 'code' :
241
261
if ( ( 0 , _utils . isNullData ) ( val ) ) val = null ;
242
- if ( val ) {
262
+ if ( val && data [ _types . fields . DESTROYED_BY ] === undefined ) {
243
263
data . type = _types . addrTypes . CONTRACT ;
244
264
}
245
265
// Fix to support suicide
246
266
data . code = val ;
247
267
break ;
248
268
269
+ case _types . fields . DESTROYED_BY :
270
+ if ( data [ prop ] !== undefined ) return true ;
271
+ val = ( 0 , _InternalTx . checkInternalTransactionData ) ( Object . assign ( { } , val ) ) ;
272
+ data [ prop ] = val ;
273
+ data . type = _types . addrTypes . ADDRESS ;
274
+ break ;
275
+
249
276
case _types . fields . LAST_BLOCK_MINED :
250
277
const lastBlock = data [ _types . fields . LAST_BLOCK_MINED ] || { } ;
251
278
let number = lastBlock . number || - 1 ;
0 commit comments