@@ -29,16 +29,33 @@ window.loadDFO = async function loadDFO(address, allAddresses) {
29
29
var votingToken = window . voidEthereumAddress ;
30
30
31
31
try {
32
- votingToken = ( await window . blockchainCall ( dfo . methods . getDelegates ) ) [ 0 ] ;
33
- } catch ( e ) { }
32
+ var delegates = await window . web3 . eth . call ( {
33
+ to : element . dFO . options . address ,
34
+ data : element . dFO . methods . getDelegates ( ) . encodeABI ( )
35
+ } ) ;
36
+ try {
37
+ delegates = window . web3 . eth . abi . decodeParameter ( "address[]" , delegates ) ;
38
+ } catch ( e ) {
39
+ delegates = window . web3 . eth . abi . decodeParameters ( [ "address" , "address" , "address" , "address" , "address" , "address" ] , delegates ) ;
40
+ }
41
+ votingToken = delegates [ 0 ] ;
42
+ } catch ( e ) {
43
+ votingToken = undefined ;
44
+ }
34
45
35
- if ( votingToken === window . voidEthereumAddress ) {
46
+ if ( ! votingToken || votingToken === window . voidEthereumAddress ) {
36
47
try {
37
48
votingToken = await window . blockchainCall ( dfo . methods . getToken ) ;
38
49
} catch ( e ) { }
39
50
}
40
51
41
- if ( votingToken === window . voidEthereumAddress ) {
52
+ try {
53
+ await window . blockchainCall ( window . newContract ( window . context . votingTokenAbi , votingToken ) . methods . name ) ;
54
+ } catch ( e ) {
55
+ votingToken = undefined ;
56
+ }
57
+
58
+ if ( ! votingToken || votingToken === window . voidEthereumAddress ) {
42
59
var logs = await window . getLogs ( {
43
60
address,
44
61
topics : [
@@ -92,14 +109,6 @@ window.onEthereumUpdate = function onEthereumUpdate(millis) {
92
109
window . ethereum && window . ethereum . on && window . ethereum . on ( 'networkChanged' , ( ) => window . onEthereumUpdate ( window . web3 . currentProvider ) ) ;
93
110
window . ethereum && window . ethereum . on && window . ethereum . on ( 'accountsChanged' , ( ) => window . onEthereumUpdate ( window . web3 . currentProvider ) ) ;
94
111
window . DFOHub ( window . web3 ) ;
95
- window . stableCoin = window . newContract ( window . context . StableCoinAbi , window . getNetworkElement ( "stableCoinAddress" ) ) ;
96
- window . doubleProxy = window . newContract ( window . context . DoubleProxyAbi , await window . blockchainCall ( window . stableCoin . methods . doubleProxy ) )
97
- window . dfo = window . web3 . eth . dfoHub . load ( await window . blockchainCall ( window . doubleProxy . methods . proxy ) ) ;
98
- window . uniswapV2Router = window . newContract ( window . context . UniswapV2RouterAbi , window . context . uniswapV2RouterAddress ) ;
99
- window . wethToken = window . newContract ( window . context . votingTokenAbi , window . wethAddress = window . web3 . utils . toChecksumAddress ( await window . blockchainCall ( window . uniswapV2Router . methods . WETH ) ) ) ;
100
- window . uniswapV2Factory = window . newContract ( window . context . UniswapV2FactoryAbi , window . context . uniswapV2FactoryAddress ) ;
101
- window . stableCoin = await window . loadTokenInfos ( stableCoin . options . address , window . wethToken . options . address , window . context . StableCoinAbi ) ;
102
- window . votingToken = await window . loadTokenInfos ( ( await ( window . dfo = await window . dfo ) . votingToken ) . options . address , window . wethToken . options . address ) ;
103
112
update = true ;
104
113
}
105
114
delete window . walletAddress ;
@@ -117,6 +126,20 @@ window.onEthereumUpdate = function onEthereumUpdate(millis) {
117
126
} ) ;
118
127
} ;
119
128
129
+ window . loadEthereumStuff = async function loadEthereumStuff ( oldStableCoin ) {
130
+ window . uniswapV2Router = window . newContract ( window . context . UniswapV2RouterAbi , window . context . uniswapV2RouterAddress ) ;
131
+ window . wethToken = window . newContract ( window . context . votingTokenAbi , window . wethAddress = window . web3 . utils . toChecksumAddress ( await window . blockchainCall ( window . uniswapV2Router . methods . WETH ) ) ) ;
132
+ window . uniswapV2Factory = window . newContract ( window . context . UniswapV2FactoryAbi , window . context . uniswapV2FactoryAddress ) ;
133
+ try {
134
+ window . stableCoin = window . newContract ( window . context . StableCoinAbi , window . getNetworkElement ( oldStableCoin ? "oldStableCoinAddress" : "stableCoinAddress" ) ) ;
135
+ window . doubleProxy = window . newContract ( window . context . DoubleProxyAbi , await window . blockchainCall ( window . stableCoin . methods . doubleProxy ) )
136
+ window . dfo = window . web3 . eth . dfoHub . load ( await window . blockchainCall ( window . doubleProxy . methods . proxy ) ) ;
137
+ window . stableCoin = await window . loadTokenInfos ( window . stableCoin . options . address , window . context . StableCoinAbi ) ;
138
+ window . votingToken = await window . loadTokenInfos ( ( await ( window . dfo = await window . dfo ) . votingToken ) . options . address ) ;
139
+ } catch ( e ) {
140
+ }
141
+ } ;
142
+
120
143
window . getNetworkElement = function getNetworkElement ( element ) {
121
144
var network = window . context . ethereumNetwork [ window . networkId ] ;
122
145
if ( network === undefined || network === null ) {
@@ -212,6 +235,12 @@ window.getAddress = async function getAddress() {
212
235
return ( window . walletAddress = ( await window . web3 . eth . getAccounts ( ) ) [ 0 ] ) ;
213
236
} ;
214
237
238
+ window . consumeAddressBarParam = function consumeAddressBarParam ( paramName ) {
239
+ var param = window . addressBarParams [ paramName ] ;
240
+ delete window . addressBarParams [ paramName ] ;
241
+ return param ;
242
+ } ;
243
+
215
244
window . getSendingOptions = function getSendingOptions ( transaction ) {
216
245
return new Promise ( async function ( ok , ko ) {
217
246
if ( transaction ) {
@@ -1200,22 +1229,21 @@ window.eliminateFloatingFinalZeroes = function eliminateFloatingFinalZeroes(valu
1200
1229
return split [ 1 ] . length === 0 ? split [ 0 ] : split . join ( decSeparator ) ;
1201
1230
} ;
1202
1231
1203
- window . loadTokenInfos = async function loadTokenInfos ( addresses , wethAddress , abi ) {
1204
- wethAddress = wethAddress || await window . blockchainCall ( window . newContract ( window . context . uniSwapV2RouterAbi , window . context . uniSwapV2RouterAddress ) . methods . WETH ) ;
1205
- wethAddress = window . web3 . utils . toChecksumAddress ( wethAddress ) ;
1232
+ window . loadTokenInfos = async function loadTokenInfos ( addresses , abi , noLogo ) {
1206
1233
var single = ( typeof addresses ) . toLowerCase ( ) === 'string' ;
1207
1234
addresses = single ? [ addresses ] : addresses ;
1208
1235
var tokens = [ ] ;
1236
+ window . tokenInfosCache = window . tokenInfosCache || { } ;
1209
1237
for ( var address of addresses ) {
1210
1238
address = window . web3 . utils . toChecksumAddress ( address ) ;
1211
1239
var token = window . newContract ( abi || window . context . votingTokenAbi , address ) ;
1212
- tokens . push ( {
1240
+ tokens . push ( window . tokenInfosCache [ address ] = window . tokenInfosCache [ address ] || {
1213
1241
address,
1214
1242
token,
1215
- name : address === wethAddress ? 'Ethereum' : await window . blockchainCall ( token . methods . name ) ,
1216
- symbol : address === wethAddress ? 'ETH' : await window . blockchainCall ( token . methods . symbol ) ,
1217
- decimals : address === wethAddress ? '18' : await window . blockchainCall ( token . methods . decimals ) ,
1218
- logo : await window . loadLogo ( address === wethAddress ? window . voidEthereumAddress : address )
1243
+ name : address === window . wethAddress ? 'Ethereum' : await window . blockchainCall ( token . methods . name ) ,
1244
+ symbol : address === window . wethAddress ? 'ETH' : await window . blockchainCall ( token . methods . symbol ) ,
1245
+ decimals : address === window . wethAddress ? '18' : await window . blockchainCall ( token . methods . decimals ) ,
1246
+ logo : noLogo ? undefined : await window . loadLogo ( address === window . wethAddress ? window . voidEthereumAddress : address )
1219
1247
} ) ;
1220
1248
}
1221
1249
return single ? tokens [ 0 ] : tokens ;
@@ -1272,4 +1300,50 @@ window.getEthereumPrice = async function getEthereumPrice() {
1272
1300
price,
1273
1301
requestExpires : new Date ( ) . getTime ( ) + window . context . coingeckoEthereumPriceRequestInterval
1274
1302
} ) . price ;
1303
+ } ;
1304
+
1305
+ window . loadUniswapPairs = async function loadUniswapPairs ( token , indexes ) {
1306
+ window . pairCreatedTopic = window . pairCreatedTopic || window . web3 . utils . sha3 ( 'PairCreated(address,address,address,uint256)' ) ;
1307
+ var address = window . web3 . utils . toChecksumAddress ( token . address ) ;
1308
+ if ( address === window . voidEthereumAddress ) {
1309
+ address = window . wethAddress ;
1310
+ }
1311
+ var myToken = window . web3 . eth . abi . encodeParameter ( 'address' , address ) ;
1312
+ var logs = await window . getLogs ( {
1313
+ address : window . context . uniSwapV2FactoryAddress ,
1314
+ fromBlock : '0' ,
1315
+ topics : [
1316
+ window . pairCreatedTopic , [ myToken ]
1317
+ ]
1318
+ } ) ;
1319
+ logs . push ( ...( await window . getLogs ( {
1320
+ address : window . context . uniSwapV2FactoryAddress ,
1321
+ fromBlock : '0' ,
1322
+ topics : [
1323
+ window . pairCreatedTopic , [ ] ,
1324
+ [ myToken ]
1325
+ ]
1326
+ } ) ) ) ;
1327
+ var uniswapPairs = [ ] ;
1328
+ var alreadyAdded = { } ;
1329
+ for ( var log of logs ) {
1330
+ for ( var topic of log . topics ) {
1331
+ if ( topic === window . pairCreatedTopic || topic . toLowerCase ( ) === myToken . toLowerCase ( ) ) {
1332
+ continue ;
1333
+ }
1334
+ var pairTokenAddress = window . web3 . utils . toChecksumAddress ( window . web3 . eth . abi . decodeParameters ( [ 'address' , 'uint256' ] , log . data ) [ 0 ] ) ;
1335
+ if ( alreadyAdded [ pairTokenAddress ] ) {
1336
+ continue ;
1337
+ }
1338
+ alreadyAdded [ pairTokenAddress ] = true ;
1339
+ var pairToken = await window . loadTokenInfos ( pairTokenAddress , window . context . UniswapV2PairAbi , true ) ;
1340
+ var token0 = window . web3 . utils . toChecksumAddress ( await window . blockchainCall ( pairToken . token . methods . token0 ) ) ;
1341
+ var token1 = window . web3 . utils . toChecksumAddress ( await window . blockchainCall ( pairToken . token . methods . token1 ) ) ;
1342
+ pairToken . token0 = token0 === address ? token : await window . loadTokenInfos ( token0 , undefined , true ) ;
1343
+ pairToken . token1 = token1 === address ? token : await window . loadTokenInfos ( token1 , undefined , true ) ;
1344
+ pairToken . key = `${ token0 } _${ token1 } -${ token1 } _${ token0 } ` ;
1345
+ uniswapPairs . push ( indexes [ pairToken . key ] = pairToken ) ;
1346
+ }
1347
+ }
1348
+ return uniswapPairs ;
1275
1349
} ;
0 commit comments