diff --git a/src/app/wallet/view.nim b/src/app/wallet/view.nim index 07d319cc1b..dba1336c95 100644 --- a/src/app/wallet/view.nim +++ b/src/app/wallet/view.nim @@ -6,6 +6,7 @@ import ../../status/libstatus/wallet as status_wallet import ../../status/libstatus/tokens import ../../status/libstatus/types import ../../status/libstatus/utils as status_utils +import ../../status/libstatus/eth/contracts import ../../status/ens as status_ens import views/[asset_list, account_list, account_item, token_list, transaction_list, collectibles_list] @@ -323,9 +324,9 @@ QtObject: self.currentAccountChanged() proc removeCustomToken*(self: WalletView, tokenAddress: string) {.slot.} = - let t = getTokenByAddress(getCustomTokens(), tokenAddress) - if t.kind == JNull: return - self.status.wallet.hideAsset(t["symbol"].getStr) + let t = getCustomTokens().getErc20ContractByAddress(parseAddress(tokenAddress)) + if t == nil: return + self.status.wallet.hideAsset(t.symbol) removeCustomToken(tokenAddress) self.customTokenList.loadCustomTokens() for account in self.status.wallet.accounts: diff --git a/src/app/wallet/views/token_list.nim b/src/app/wallet/views/token_list.nim index 98eb6038c9..603066a8c8 100644 --- a/src/app/wallet/views/token_list.nim +++ b/src/app/wallet/views/token_list.nim @@ -1,6 +1,7 @@ -import NimQml, tables, json -import ../../../status/libstatus/default_tokens +import NimQml, tables import ../../../status/libstatus/tokens +import ../../../status/libstatus/eth/contracts +from web3/conversions import `$` type TokenRoles {.pure.} = enum @@ -12,7 +13,7 @@ type QtObject: type TokenList* = ref object of QAbstractListModel - tokens*: seq[JsonNode] + tokens*: seq[Erc20Contract] proc setup(self: TokenList) = self.QAbstractListModel.setup @@ -25,12 +26,12 @@ QtObject: proc loadDefaultTokens*(self:TokenList) = if self.tokens.len == 0: - self.tokens = getDefaultTokens().getElems() + self.tokens = getErc20Contracts() self.tokensLoaded(self.tokens.len) proc loadCustomTokens*(self: TokenList) = self.beginResetModel() - self.tokens = getCustomTokens().getElems() + self.tokens = getCustomTokens() self.tokensLoaded(self.tokens.len) self.endResetModel() @@ -44,11 +45,11 @@ QtObject: return let token = self.tokens[index] case column: - of "name": result = token["name"].getStr - of "symbol": result = token["symbol"].getStr - of "hasIcon": result = $token["hasIcon"].getBool - of "address": result = token["address"].getStr - of "decimals": result = $token["decimals"].getInt + of "name": result = token.name + of "symbol": result = token.symbol + of "hasIcon": result = $token.hasIcon + of "address": result = $token.address + of "decimals": result = $token.decimals method rowCount(self: TokenList, index: QModelIndex = nil): int = return self.tokens.len @@ -61,11 +62,11 @@ QtObject: let token = self.tokens[index.row] let tokenRole = role.TokenRoles case tokenRole: - of TokenRoles.Name: result = newQVariant(token["name"].getStr) - of TokenRoles.Symbol: result = newQVariant(token["symbol"].getStr) - of TokenRoles.HasIcon: result = newQVariant(token{"hasIcon"}.getBool) - of TokenRoles.Address: result = newQVariant(token["address"].getStr) - of TokenRoles.Decimals: result = newQVariant(token["decimals"].getInt) + of TokenRoles.Name: result = newQVariant(token.name) + of TokenRoles.Symbol: result = newQVariant(token.symbol) + of TokenRoles.HasIcon: result = newQVariant(token.hasIcon) + of TokenRoles.Address: result = newQVariant($token.address) + of TokenRoles.Decimals: result = newQVariant(token.decimals) method roleNames(self: TokenList): Table[int, string] = {TokenRoles.Name.int:"name", diff --git a/src/status/ens.nim b/src/status/ens.nim index a3085a94bc..0a650f704c 100644 --- a/src/status/ens.nim +++ b/src/status/ens.nim @@ -153,7 +153,7 @@ proc registerUsernameEstimateGas*(username: string, address: string, pubKey: str x = fromHex(FixedBytes[32], coordinates.x) y = fromHex(FixedBytes[32], coordinates.y) ensUsernamesContract = contracts.getContract("ens-usernames") - sntContract = contracts.getContract("snt") + sntContract = contracts.getSntContract() price = getPrice() let @@ -175,7 +175,7 @@ proc registerUsername*(username, pubKey, address, gas, gasPrice, password: stri x = fromHex(FixedBytes[32], coordinates.x) y = fromHex(FixedBytes[32], coordinates.y) ensUsernamesContract = contracts.getContract("ens-usernames") - sntContract = contracts.getContract("snt") + sntContract = contracts.getSntContract() price = getPrice() let diff --git a/src/status/libstatus/default_tokens.nim b/src/status/libstatus/default_tokens.nim deleted file mode 100644 index bf3cc4d021..0000000000 --- a/src/status/libstatus/default_tokens.nim +++ /dev/null @@ -1,1282 +0,0 @@ -import json -import settings -import types - -proc getDefaultTokens*(): JsonNode = - if getCurrentNetwork() == Network.Testnet: - return %* [ - { - "symbol": "STT", - "name": "Status Test Token", - "address": "0xc55cf4b03948d7ebc8b9e8bad92643703811d162", - "decimals": 18, - "hasIcon": true - } - ] - - if getCurrentNetwork() == Network.Mainnet: - return %* [ - { - "symbol": "DAI", - "name": "Dai Stablecoin", - "address": "0x6b175474e89094c44da98b954eedeac495271d0f", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "SAI", - "name": "Sai Stablecoin v1.0", - "address": "0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "MKR", - "name": "MKR", - "address": "0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "EOS", - "name": "EOS", - "address": "0x86fa049857e0209aa7d9e616f7eb3b3b78ecfdb0", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "OMG", - "name": "OMGToken", - "address": "0xd26114cd6ee289accf82350c8d8487fedb8a0c07", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "PPT", - "name": "Populous Platform", - "address": "0xd4fa1460f537bb9085d22c7bccb5dd450ef28e3a", - "decimals": 8, - "hasIcon": true - }, - { - "symbol": "REP", - "name": "Reputation", - "address": "0x1985365e9f78359a9b6ad760e32412f4a445e862", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "POWR", - "name": "PowerLedger", - "address": "0x595832f8fc6bf59c85c527fec3740a1b7a361269", - "decimals": 6, - "hasIcon": true - }, - { - "symbol": "PAY", - "name": "TenX Pay Token", - "address": "0xb97048628db6b661d4c2aa833e95dbe1a905b280", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "VRS", - "name": "Veros", - "address": "0x92e78dae1315067a8819efd6dca432de9dcde2e9", - "decimals": 6, - "hasIcon": false - }, - { - "symbol": "GNT", - "name": "Golem Network Token", - "address": "0xa74476443119a942de498590fe1f2454d7d4ac0d", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "SALT", - "name": "Salt", - "address": "0x4156d3342d5c385a87d264f90653733592000581", - "decimals": 8, - "hasIcon": true - }, - { - "symbol": "BNB", - "name": "BNB", - "address": "0xb8c77482e45f1f44de1745f52c74426c631bdd52", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "BAT", - "name": "Basic Attention Token", - "address": "0x0d8775f648430679a709e98d2b0cb6250d2887ef", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "KNC", - "name": "Kyber Network Crystal", - "address": "0xdd974d5c2e2928dea5f71b9825b8b646686bd200", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "BTU", - "name": "BTU Protocol", - "address": "0xb683D83a532e2Cb7DFa5275eED3698436371cc9f", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "DGD", - "name": "Digix DAO", - "address": "0xe0b7927c4af23765cb51314a0e0521a9645f0e2a", - "decimals": 9, - "skipDecimalsCheck": true, - "hasIcon": true - }, - { - "symbol": "AE", - "name": "Aeternity", - "address": "0x5ca9a71b1d01849c0a95490cc00559717fcf0d1d", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "TRX", - "name": "Tronix", - "address": "0xf230b790e05390fc8295f4d3f60332c93bed42e2", - "decimals": 6, - "hasIcon": true - }, - { - "symbol": "ETHOS", - "name": "Ethos", - "address": "0x5af2be193a6abca9c8817001f45744777db30756", - "decimals": 8, - "hasIcon": true - }, - { - "symbol": "RDN", - "name": "Raiden Token", - "address": "0x255aa6df07540cb5d3d297f0d0d4d84cb52bc8e6", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "SNT", - "name": "Status Network Token", - "address": "0x744d70fdbe2ba4cf95131626614a1763df805b9e", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "SNGLS", - "name": "SingularDTV", - "address": "0xaec2e87e0a235266d9c5adc9deb4b2e29b54d009", - "decimals": 0, - "hasIcon": true - }, - { - "symbol": "GNO", - "name": "Gnosis Token", - "address": "0x6810e776880c02933d47db1b9fc05908e5386b96", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "STORJ", - "name": "StorjToken", - "address": "0xb64ef51c888972c908cfacf59b47c1afbc0ab8ac", - "decimals": 8, - "hasIcon": true - }, - { - "symbol": "ADX", - "name": "AdEx", - "address": "0x4470bb87d77b963a013db939be332f927f2b992e", - "decimals": 4, - "hasIcon": false - }, - { - "symbol": "FUN", - "name": "FunFair", - "address": "0x419d0d8bdd9af5e606ae2232ed285aff190e711b", - "decimals": 8, - "hasIcon": true - }, - { - "symbol": "CVC", - "name": "Civic", - "address": "0x41e5560054824ea6b0732e656e3ad64e20e94e45", - "decimals": 8, - "hasIcon": true - }, - { - "symbol": "ICN", - "name": "ICONOMI", - "address": "0x888666ca69e0f178ded6d75b5726cee99a87d698", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "WTC", - "name": "Walton Token", - "address": "0xb7cb1c96db6b22b0d3d9536e0108d062bd488f74", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "BTM", - "name": "Bytom", - "address": "0xcb97e65f07da24d46bcdd078ebebd7c6e6e3d750", - "decimals": 8, - "hasIcon": true - }, - { - "symbol": "ZRX", - "name": "0x Protocol Token", - "address": "0xe41d2489571d322189246dafa5ebde1f4699f498", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "BNT", - "name": "Bancor Network Token", - "address": "0x1f573d6fb3f13d689ff844b4ce37794d79a7ff1c", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "MTL", - "name": "Metal", - "address": "0xf433089366899d83a9f26a773d59ec7ecf30355e", - "decimals": 8, - "hasIcon": false - }, - { - "symbol": "PPP", - "name": "PayPie", - "address": "0xc42209accc14029c1012fb5680d95fbd6036e2a0", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "LINK", - "name": "ChainLink Token", - "address": "0x514910771af9ca656af840dff83e8264ecf986ca", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "KIN", - "name": "Kin", - "address": "0x818fc6c2ec5986bc6e2cbf00939d90556ab12ce5", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "ANT", - "name": "Aragon Network Token", - "address": "0x960b236a07cf122663c4303350609a66a7b288c0", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "MGO", - "name": "MobileGo Token", - "address": "0x40395044ac3c0c57051906da938b54bd6557f212", - "decimals": 8, - "hasIcon": true - }, - { - "symbol": "MCO", - "name": "Monaco", - "address": "0xb63b606ac810a52cca15e44bb630fd42d8d1d83d", - "decimals": 8, - "hasIcon": true - }, - { - "symbol": "LRC", - "name": "loopring", - "address": "0xef68e7c694f40c8202821edf525de3782458639f", - "decimals": 18, - "skipDecimalsCheck": true, - "hasIcon": true - }, - { - "symbol": "ZSC", - "name": "Zeus Shield Coin", - "address": "0x7a41e0517a5eca4fdbc7fbeba4d4c47b9ff6dc63", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "DATA", - "name": "Streamr DATAcoin", - "address": "0x0cf0ee63788a0849fe5297f3407f701e122cc023", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "RCN", - "name": "Ripio Credit Network Token", - "address": "0xf970b8e36e23f7fc3fd752eea86f8be8d83375a6", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "WINGS", - "name": "WINGS", - "address": "0x667088b212ce3d06a1b553a7221e1fd19000d9af", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "EDG", - "name": "Edgeless", - "address": "0x08711d3b02c8758f2fb3ab4e80228418a7f8e39c", - "decimals": 0, - "hasIcon": true - }, - { - "symbol": "MLN", - "name": "Melon Token", - "address": "0xbeb9ef514a379b997e0798fdcc901ee474b6d9a1", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "MDA", - "name": "Moeda Loyalty Points", - "address": "0x51db5ad35c671a87207d88fc11d593ac0c8415bd", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "PLR", - "name": "PILLAR", - "address": "0xe3818504c1b32bf1557b16c238b2e01fd3149c17", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "QRL", - "name": "QRL", - "address": "0x697beac28b09e122c4332d163985e8a73121b97f", - "decimals": 8, - "hasIcon": true - }, - { - "symbol": "MOD", - "name": "Modum Token", - "address": "0x957c30ab0426e0c93cd8241e2c60392d08c6ac8e", - "decimals": 0, - "hasIcon": true - }, - { - "symbol": "TAAS", - "name": "Token-as-a-Service", - "address": "0xe7775a6e9bcf904eb39da2b68c5efb4f9360e08c", - "decimals": 6, - "hasIcon": true - }, - { - "symbol": "GRID", - "name": "GRID Token", - "address": "0x12b19d3e2ccc14da04fae33e63652ce469b3f2fd", - "decimals": 12, - "hasIcon": true - }, - { - "symbol": "SAN", - "name": "SANtiment network token", - "address": "0x7c5a0ce9267ed19b22f8cae653f198e3e8daf098", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "SNM", - "name": "SONM Token", - "address": "0x983f6d60db79ea8ca4eb9968c6aff8cfa04b3c63", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "REQ", - "name": "Request Token", - "address": "0x8f8221afbb33998d8584a2b05749ba73c37a938a", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "SUB", - "name": "Substratum", - "address": "0x12480e24eb5bec1a9d4369cab6a80cad3c0a377a", - "decimals": 2, - "hasIcon": true - }, - { - "symbol": "MANA", - "name": "Decentraland MANA", - "address": "0x0f5d2fb29fb7d3cfee444a200298f468908cc942", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "AST", - "name": "AirSwap Token", - "address": "0x27054b13b1b798b345b591a4d22e6562d47ea75a", - "decimals": 4, - "hasIcon": true - }, - { - "symbol": "R", - "name": "R token", - "address": "0x48f775efbe4f5ece6e0df2f7b5932df56823b990", - "decimals": 0, - "hasIcon": true - }, - { - "symbol": "1ST", - "name": "FirstBlood Token", - "address": "0xaf30d2a7e90d7dc361c8c4585e9bb7d2f6f15bc7", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "CFI", - "name": "Cofoundit", - "address": "0x12fef5e57bf45873cd9b62e9dbd7bfb99e32d73e", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "ENG", - "name": "Enigma", - "address": "0xf0ee6b27b759c9893ce4f094b49ad28fd15a23e4", - "decimals": 8, - "hasIcon": true - }, - { - "symbol": "AMB", - "name": "Amber Token", - "address": "0x4dc3643dbc642b72c158e7f3d2ff232df61cb6ce", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "XPA", - "name": "XPlay Token", - "address": "0x90528aeb3a2b736b780fd1b6c478bb7e1d643170", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "OTN", - "name": "Open Trading Network", - "address": "0x881ef48211982d01e2cb7092c915e647cd40d85c", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "TRST", - "name": "Trustcoin", - "address": "0xcb94be6f13a1182e4a4b6140cb7bf2025d28e41b", - "decimals": 6, - "hasIcon": true - }, - { - "symbol": "TKN", - "name": "Monolith TKN", - "address": "0xaaaf91d9b90df800df4f55c205fd6989c977e73a", - "decimals": 8, - "hasIcon": true - }, - { - "symbol": "RHOC", - "name": "RHOC", - "address": "0x168296bb09e24a88805cb9c33356536b980d3fc5", - "decimals": 8, - "hasIcon": true - }, - { - "symbol": "TGT", - "name": "Target Coin", - "address": "0xac3da587eac229c9896d919abc235ca4fd7f72c1", - "decimals": 1, - "hasIcon": false - }, - { - "symbol": "EVX", - "name": "Everex", - "address": "0xf3db5fa2c66b7af3eb0c0b782510816cbe4813b8", - "decimals": 4, - "hasIcon": true - }, - { - "symbol": "ICOS", - "name": "ICOS", - "address": "0x014b50466590340d41307cc54dcee990c8d58aa8", - "decimals": 6, - "hasIcon": true - }, - { - "symbol": "DNT", - "name": "district0x Network Token", - "address": "0x0abdace70d3790235af448c88547603b945604ea", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "٨", - "name": "Dentacoin", - "address": "0x08d32b0da63e2c3bcf8019c9c5d849d7a9d791e6", - "decimals": 0, - "hasIcon": false - }, - { - "symbol": "EDO", - "name": "Eidoo Token", - "address": "0xced4e93198734ddaff8492d525bd258d49eb388e", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "CSNO", - "name": "BitDice", - "address": "0x29d75277ac7f0335b2165d0895e8725cbf658d73", - "decimals": 8, - "hasIcon": false - }, - { - "symbol": "COB", - "name": "Cobinhood Token", - "address": "0xb2f7eb1f2c37645be61d73953035360e768d81e6", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "ENJ", - "name": "Enjin Coin", - "address": "0xf629cbd94d3791c9250152bd8dfbdf380e2a3b9c", - "decimals": 18, - "hasIcon": false - }, - { - "symbol": "AVT", - "name": "AVENTUS", - "address": "0x0d88ed6e74bbfd96b831231638b66c05571e824f", - "decimals": 18, - "hasIcon": false - }, - { - "symbol": "TIME", - "name": "Chronobank TIME", - "address": "0x6531f133e6deebe7f2dce5a0441aa7ef330b4e53", - "decimals": 8, - "hasIcon": false - }, - { - "symbol": "CND", - "name": "Cindicator Token", - "address": "0xd4c435f5b09f855c3317c8524cb1f586e42795fa", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "STX", - "name": "Stox", - "address": "0x006bea43baa3f7a6f765f14f10a1a1b08334ef45", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "XAUR", - "name": "Xaurum", - "address": "0x4df812f6064def1e5e029f1ca858777cc98d2d81", - "decimals": 8, - "hasIcon": true - }, - { - "symbol": "VIB", - "name": "Vibe", - "address": "0x2c974b2d0ba1716e644c1fc59982a89ddd2ff724", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "PRG", - "name": "PRG", - "address": "0x7728dfef5abd468669eb7f9b48a7f70a501ed29d", - "decimals": 6, - "hasIcon": false - }, - { - "symbol": "DPY", - "name": "Delphy Token", - "address": "0x6c2adc2073994fb2ccc5032cc2906fa221e9b391", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "CDT", - "name": "CoinDash Token", - "address": "0x2fe6ab85ebbf7776fee46d191ee4cea322cecf51", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "TNT", - "name": "Tierion Network Token", - "address": "0x08f5a9235b08173b7569f83645d2c7fb55e8ccd8", - "decimals": 8, - "hasIcon": true - }, - { - "symbol": "DRT", - "name": "DomRaiderToken", - "address": "0x9af4f26941677c706cfecf6d3379ff01bb85d5ab", - "decimals": 8, - "hasIcon": true - }, - { - "symbol": "SPANK", - "name": "SPANK", - "address": "0x42d6622dece394b54999fbd73d108123806f6a18", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "BRLN", - "name": "Berlin Coin", - "address": "0x80046305aaab08f6033b56a360c184391165dc2d", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "USDC", - "name": "USD//C", - "address": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", - "decimals": 6, - "hasIcon": true - }, - { - "symbol": "LPT", - "name": "Livepeer Token", - "address": "0x58b6a8a3302369daec383334672404ee733ab239", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "ST", - "name": "Simple Token", - "address": "0x2c4e8f2d746113d0696ce89b35f0d8bf88e0aeca", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "WBTC", - "name": "Wrapped BTC", - "address": "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599", - "decimals": 8, - "hasIcon": true - }, - { - "symbol": "BLT", - "name": "Bloom Token", - "address": "0x107c4504cd79c5d2696ea0030a8dd4e92601b82e", - "decimals": 18, - "hasIcon": true - }, - # NOTE(goranjovic): the following tokens are collectibles - { - "symbol": "CK", - "nft": true, - "name": "CryptoKitties", - "address": "0x06012c8cf97bead5deae237070f9587f8e7a266d", - "hasIcon": true - }, - { - "symbol": "EMONA", - "nft": true, - "name": "EtheremonAsset", - "address": "0xb2c0782ae4a299f7358758b2d15da9bf29e1dd99", - "hasIcon": true - }, - { - "symbol": "STRK", - "nft": true, - "name": "CryptoStrikers", - "address": "0xdcaad9fd9a74144d226dbf94ce6162ca9f09ed7e", - "hasIcon": true - }, - { - "symbol": "SUPR", - "nft": true, - "name": "SupeRare", - "address": "0x41a322b28d0ff354040e2cbc676f0320d8c8850d", - "hasIcon": true - }, - { - "symbol": "KDO", - "nft": true, - "name": "KudosToken", - "address": "0x2aea4add166ebf38b63d09a75de1a7b94aa24163", - "hasIcon": true - }, - { - "address": "0x99ea4dB9EE77ACD40B119BD1dC4E33e1C070b80d", - "decimals": 18, - "symbol": "QSP", - "name": "Quantstamp Token", - "hasIcon": true - }, - { - "address": "0x80fB784B7eD66730e8b1DBd9820aFD29931aab03", - "decimals": 18, - "symbol": "LEND", - "name": "EHTLend", - "hasIcon": false - }, - { - "address": "0xA15C7Ebe1f07CaF6bFF097D8a589fb8AC49Ae5B3", - "decimals": 18, - "symbol": "NPXS", - "name": "Pundi X Token", - "hasIcon": false - }, - { - "address": "0xA4e8C3Ec456107eA67d3075bF9e3DF3A75823DB0", - "decimals": 18, - "symbol": "LOOM", - "name": "Loom Network", - "hasIcon": false - }, - { - "address": "0x0e0989b1f9B8A38983c2BA8053269Ca62Ec9B195", - "decimals": 8, - "symbol": "POE", - "name": "Po.et Tokens", - "hasIcon": false - }, - { - "address": "0x5732046A883704404F284Ce41FfADd5b007FD668", - "decimals": 18, - "symbol": "BLZ", - "name": "Bluzelle", - "hasIcon": false - }, - { - "address": "0xFA1a856Cfa3409CFa145Fa4e20Eb270dF3EB21ab", - "decimals": 18, - "symbol": "IOST", - "name": "IOSToken", - "hasIcon": false - }, - { - "address": "0x1776e1F26f98b1A5dF9cD347953a26dd3Cb46671", - "decimals": 18, - "symbol": "NMR", - "name": "Numerai", - "hasIcon": true - }, - { - "address": "0x8E870D67F660D95d5be530380D0eC0bd388289E1", - "decimals": 18, - "symbol": "PAX", - "name": "Paxos Standard (PAX)", - "hasIcon": false - }, - { - "address": "0x08d32b0da63e2C3bcF8019c9c5d849d7a9d791e6", - "decimals": 0, - "symbol": "DCN", - "name": "Dentacoin", - "hasIcon": true - }, - { - "address": "0xEA26c4aC16D4a5A106820BC8AEE85fd0b7b2b664", - "decimals": 18, - "symbol": "QKC", - "name": "QuarkChain", - "hasIcon": false - }, - { - "address": "0x45804880De22913dAFE09f4980848ECE6EcbAf78", - "decimals": 18, - "symbol": "PAXG", - "name": "Paxos Gold", - "hasIcon": false - }, - { - "address": "0x865ec58b06bF6305B886793AA20A2da31D034E68", - "decimals": 18, - "symbol": "MOC", - "name": "Moss Coin", - "hasIcon": false - }, - { - "address": "0x408e41876cCCDC0F92210600ef50372656052a38", - "decimals": 18, - "symbol": "REN", - "name": "Republic Token", - "hasIcon": false - }, - { - "address": "0x607F4C5BB672230e8672085532f7e901544a7375", - "decimals": 9, - "symbol": "RLC", - "name": "IEx.ec", - "hasIcon": true - }, - { - "address": "0x8400D94A5cb0fa0D041a3788e395285d61c9ee5e", - "decimals": 8, - "symbol": "UBT", - "name": "Unibright", - "hasIcon": false - }, - { - "address": "0x4f3AfEC4E5a3F2A6a1A411DEF7D7dFe50eE057bF", - "decimals": 9, - "symbol": "DGX", - "name": "Digix Gold Token", - "hasIcon": false - }, - { - "address": "0xEA38eAa3C86c8F9B751533Ba2E562deb9acDED40", - "decimals": 18, - "symbol": "FUEL", - "name": "Etherparty FUEL", - "hasIcon": true - }, - { - "address": "0x00000100F2A2bd000715001920eB70D229700085", - "decimals": 18, - "symbol": "TCAD", - "name": "TrueCAD", - "hasIcon": false - }, - { - "address": "0x6710c63432A2De02954fc0f851db07146a6c0312", - "decimals": 18, - "symbol": "MFG", - "name": "SyncFab Smart Manufacturing Blockchain", - "hasIcon": false - }, - { - "address": "0x543Ff227F64Aa17eA132Bf9886cAb5DB55DCAddf", - "decimals": 18, - "symbol": "GEN", - "name": "DAOstack", - "hasIcon": false - }, - { - "address": "0x0E8d6b471e332F140e7d9dbB99E5E3822F728DA6", - "decimals": 18, - "symbol": "ABYSS", - "name": "The Abyss", - "hasIcon": false - }, - { - "address": "0xB62132e35a6c13ee1EE0f84dC5d40bad8d815206", - "decimals": 18, - "symbol": "NEXO", - "name": "Nexo", - "hasIcon": false - }, - { - "address": "0x0000000000085d4780B73119b644AE5ecd22b376", - "decimals": 18, - "symbol": "TUSD", - "name": "TrueUSD", - "hasIcon": false - }, - { - "address": "0xD0a4b8946Cb52f0661273bfbC6fD0E0C75Fc6433", - "decimals": 18, - "symbol": "STORM", - "name": "Storm Token", - "hasIcon": false - }, - { - "address": "0xaF4DcE16Da2877f8c9e00544c93B62Ac40631F16", - "decimals": 5, - "symbol": "MTH", - "name": "Monetha", - "hasIcon": true - }, - { - "address": "0x00000000441378008EA67F4284A57932B1c000a5", - "decimals": 18, - "symbol": "TGBP", - "name": "TrueGBP", - "hasIcon": false - }, - { - "address": "0xbf2179859fc6D5BEE9Bf9158632Dc51678a4100e", - "decimals": 18, - "symbol": "ELF", - "name": "ELF Token", - "hasIcon": false - }, - { - "address": "0x9992eC3cF6A55b00978cdDF2b27BC6882d88D1eC", - "decimals": 18, - "symbol": "POLY", - "name": "Polymath Network", - "hasIcon": false - }, - { - "address": "0x20F7A3DdF244dc9299975b4Da1C39F8D5D75f05A", - "decimals": 6, - "symbol": "SPN", - "name": "Sapien", - "hasIcon": false - }, - { - "address": "0x1a7a8BD9106F2B8D977E08582DC7d24c723ab0DB", - "decimals": 18, - "symbol": "APPC", - "name": "AppCoins", - "hasIcon": false - }, - { - "address": "0xdAC17F958D2ee523a2206206994597C13D831ec7", - "decimals": 6, - "symbol": "USDT", - "name": "USD Tether (erc20)", - "hasIcon": false - }, - { - "address": "0xa3d58c4E56fedCae3a7c43A725aeE9A71F0ece4e", - "decimals": 18, - "symbol": "MET", - "name": "Metronome", - "hasIcon": false - }, - { - "address": "0x6f259637dcD74C767781E37Bc6133cd6A68aa161", - "decimals": 18, - "symbol": "HT", - "name": "Huobi Token", - "hasIcon": false - }, - { - "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", - "decimals": 18, - "symbol": "WETH", - "name": "WETH", - "hasIcon": false - }, - { - "address": "0x8f3470A7388c05eE4e7AF3d01D8C722b0FF52374", - "decimals": 18, - "symbol": "VERI", - "name": "Veritaseum", - "hasIcon": true - }, - { - "address": "0x00006100F7090010005F1bd7aE6122c3C2CF0090", - "decimals": 18, - "symbol": "TAUD", - "name": "TrueAUD", - "hasIcon": false - }, - { - "address": "0x66497A283E0a007bA3974e837784C6AE323447de", - "decimals": 18, - "symbol": "PT", - "name": "PornToken", - "hasIcon": false - }, - { - "address": "0xB24754bE79281553dc1adC160ddF5Cd9b74361a4", - "decimals": 9, - "symbol": "XRL", - "name": "XRL", - "hasIcon": true - }, - { - "address": "0xC011A72400E58ecD99Ee497CF89E3775d4bd732F", - "decimals": 18, - "symbol": "SNX", - "name": "Synthetix Network Token", - "hasIcon": false - }, - { - "address": "0x07e3c70653548B04f0A75970C1F81B4CBbFB606f", - "decimals": 18, - "symbol": "DLT", - "name": "Agrello", - "hasIcon": true - }, - { - "address": "0x8207c1FfC5B6804F6024322CcF34F29c3541Ae26", - "decimals": 18, - "symbol": "OGN", - "name": "OriginToken", - "hasIcon": false - }, - { - "address": "0x554C20B7c486beeE439277b4540A434566dC4C02", - "decimals": 18, - "symbol": "HST", - "name": "Decision Token", - "hasIcon": true - }, - { - "address": "0x286BDA1413a2Df81731D4930ce2F862a35A609fE", - "decimals": 18, - "symbol": "WABI", - "name": "Tael", - "hasIcon": false - }, - { - "address": "0xE5a3229CCb22b6484594973A03a3851dCd948756", - "decimals": 18, - "symbol": "RAE", - "name": "RAE Token", - "hasIcon": false - }, - { - "address": "0x24692791Bc444c5Cd0b81e3CBCaba4b04Acd1F3B", - "decimals": 18, - "symbol": "UKG", - "name": "UnikoinGold", - "hasIcon": true - }, - { - "address": "0xD46bA6D942050d489DBd938a2C909A5d5039A161", - "decimals": 9, - "symbol": "AMPL", - "name": "Ampleforth", - "hasIcon": false - }, - { - "address": "0xA4Bdb11dc0a2bEC88d24A3aa1E6Bb17201112eBe", - "decimals": 6, - "symbol": "USDS", - "name": "StableUSD", - "hasIcon": false - }, - { - "address": "0xB98d4C97425d9908E66E53A6fDf673ACcA0BE986", - "decimals": 18, - "symbol": "ABT", - "name": "ArcBlock Token", - "hasIcon": false - }, - { - "address": "0x81c9151de0C8bafCd325a57E3dB5a5dF1CEBf79c", - "decimals": 18, - "symbol": "DAT", - "name": "Datum Token", - "hasIcon": false - }, - { - "address": "0xa6a840E50bCaa50dA017b91A0D86B8b2d41156EE", - "decimals": 18, - "symbol": "EKO", - "name": "EchoLink", - "hasIcon": false - }, - { - "address": "0x2C4e8f2D746113d0696cE89B35F0d8bF88E0AEcA", - "decimals": 18, - "symbol": "OST", - "name": "Simple Token 'OST'", - "hasIcon": false - }, - { - "address": "0xc92D6E3E64302C59d734f3292E2A13A13D7E1817", - "decimals": 8, - "symbol": "FXC", - "name": "FUTURAX", - "hasIcon": false - }, - { - "address": "0x4a57E687b9126435a9B19E4A802113e266AdeBde", - "decimals": 18, - "symbol": "FXC", - "name": "Flexacoin", - "hasIcon": false - }, - { - "address": "0xC86D054809623432210c107af2e3F619DcFbf652", - "decimals": 18, - "symbol": "UPP", - "name": "Sentinel Protocol", - "hasIcon": false - }, - { - "address": "0x5Af2Be193a6ABCa9c8817001F45744777Db30756", - "decimals": 8, - "symbol": "BQX", - "name": "Bitquence", - "hasIcon": false - }, - { - "address": "0x69b148395ce0015c13e36bffbad63f49ef874e03", - "symbol": "DTA", - "name": "Data", - "decimals": 18, - "hasIcon": false - }, - { - "address": "0x57ab1e02fee23774580c119740129eac7081e9d3", - "symbol": "SUSD", - "name": "Synth sUSD", - "decimals": 18, - "hasIcon": false - }, - { - "address": "0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643", - "symbol": "CDAI", - "name": "Compound Dai", - "decimals": 8, - "hasIcon": false - }, - { - "address": "0xba11d00c5f74255f56a5e366f4f77f5a186d7f55", - "symbol": "BAND", - "name": "BandToken", - "decimals": 18, - "hasIcon": false - }, - { - "address": "0xa7fc5d2453e3f68af0cc1b78bcfee94a1b293650", - "symbol": "SPIKE", - "name": "Spiking", - "decimals": 10, - "hasIcon": false - }, - { - "address": "0x1f9840a85d5af5bf1d1762f925bdaddc4201f984", - "symbol": "UNI", - "name": "Uniswap", - "decimals": 18, - "hasIcon": false - }, - { - "address": "0xc00e94cb662c3520282e6f5717214004a7f26888", - "symbol": "COMP", - "name": "Compound", - "decimals": 18, - "hasIcon": false - }, - { - "address": "0xba100000625a3754423978a60c9317c58a424e3d", - "symbol": "BAL", - "name": "Balancer", - "decimals": 18, - "hasIcon": false - }, - { - "address": "0x8ab7404063ec4dbcfd4598215992dc3f8ec853d7", - "symbol": "AKRO", - "name": "Akropolis", - "decimals": 18, - "hasIcon": false - }, - { - "address": "0x4575f41308EC1483f3d399aa9a2826d74Da13Deb", - "symbol": "OXT", - "name": "Orchid", - "decimals": 18, - "hasIcon": false - } - ] - - if getCurrentNetwork() == Network.Testnet: - return %* [ - { - "symbol": "STT", - "name": "Status Test Token", - "address": "0xc55cf4b03948d7ebc8b9e8bad92643703811d162", - "decimals": 18, - "hasIcon": true - }, - { - "symbol": "HND", - "name": "Handy Test Token", - "address": "0xdee43a267e8726efd60c2e7d5b81552dcd4fa35c", - "decimals": 0, - "hasIcon": false - }, - { - "symbol": "LXS", - "name": "Lucky Test Token", - "address": "0x703d7dc0bc8e314d65436adf985dda51e09ad43b", - "decimals": 2, - "hasIcon": false - }, - { - "symbol": "ADI", - "name": "Adi Test Token", - "address": "0xe639e24346d646e927f323558e6e0031bfc93581", - "decimals": 7, - "hasIcon": false - }, - { - "symbol": "WGN", - "name": "Wagner Test Token", - "address": "0x2e7cd05f437eb256f363417fd8f920e2efa77540", - "decimals": 10, - "hasIcon": false - }, - { - "symbol": "MDS", - "name": "Modest Test Token", - "address": "0x57cc9b83730e6d22b224e9dc3e370967b44a2de0", - "decimals": 18, - "hasIcon": false - } - ] - - if getCurrentNetwork() == Network.Rinkeby: - return %* [ - { - "symbol": "MOKSHA", - "name": "Moksha Coin", - "address": "0x6ba7dc8dd10880ab83041e60c4ede52bb607864b", - "decimals": 18, - "hasIcon": false - }, - { - "symbol": "KDO", - "nft": true, - "name": "KudosToken", - "address": "0x93bb0afbd0627bbd3a6c72bc318341d3a22e254a", - "hasIcon": false - }, - { - "symbol": "WIBB", - "name": "WIBB", - "address": "0x7d4ccf6af2f0fdad48ee7958bcc28bdef7b732c7", - "decimals": 18, - "hasIcon": false - }, - { - "symbol": "STT", - "name": "Status Test Token", - "address": "0x43d5adc3b49130a575ae6e4b00dfa4bc55c71621", - "decimals": 18, - "hasIcon": false - } - ] - - if getCurrentNetwork() == Network.XDai: - return %* [ - { - "symbol": "BUFF", - "name": "buffiDai", - "address": "0x3e50bf6703fc132a94e4baff068db2055655f11b", - "decimals": 18, - "hasIcon": false - } - ] - - return %* [] diff --git a/src/status/libstatus/eth/contracts.nim b/src/status/libstatus/eth/contracts.nim index 64b0234de6..27a528757c 100644 --- a/src/status/libstatus/eth/contracts.nim +++ b/src/status/libstatus/eth/contracts.nim @@ -1,8 +1,8 @@ import - sequtils, sugar, macros, tables, strutils + sequtils, sugar, macros, tables, strutils, locks import - web3/ethtypes, stew/byteutils, nimcrypto + web3/ethtypes, stew/byteutils, nimcrypto, json_serialization, chronicles import ../types, ../settings, ../coder, transactions, methods, ../utils @@ -12,113 +12,300 @@ export TokenOfOwnerByIndex, TokenPackId, TokenUri, FixedBytes, DynamicBytes, toHex, fromHex, decodeContractResponse, encodeAbi, estimateGas, send, call -type Contract* = ref object - name*: string - network*: Network - address*: Address - methods*: Table[string, Method] -proc allContracts(): seq[Contract] = @[ - Contract(name: "snt", network: Network.Mainnet, address: parseAddress("0x744d70fdbe2ba4cf95131626614a1763df805b9e"), - methods: [ - ("approveAndCall", Method(signature: "approveAndCall(address,uint256,bytes)")), - ("transfer", Method(signature: "transfer(address,uint256)")) - ].toTable - ), - Contract(name: "snt", network: Network.Testnet, address: parseAddress("0xc55cf4b03948d7ebc8b9e8bad92643703811d162"), - methods: [ - ("approveAndCall", Method(signature: "approveAndCall(address,uint256,bytes)")), - ("transfer", Method(signature: "transfer(address,uint256)")) - ].toTable - ), - Contract(name: "tribute-to-talk", network: Network.Testnet, address: parseAddress("0xC61aa0287247a0398589a66fCD6146EC0F295432")), +logScope: + topics = "contracts" + +var contractsLock: Lock +initLock(contractsLock) + +const ERC20_METHODS = @[ + ("name", Method(signature: "name()")), + ("symbol", Method(signature: "symbol()")), + ("decimals", Method(signature: "decimals()")), + ("totalSupply", Method(signature: "totalSupply()")), + ("balanceOf", Method(signature: "balanceOf(address)")), + ("transfer", Method(signature: "transfer(address,uint256)")), + ("allowance", Method(signature: "allowance(address,address)")), + ("approve", Method(signature: "approve(address,uint256)")), + ("transferFrom", Method(signature: "approve(address,address,uint256)")), + ("increaseAllowance", Method(signature: "increaseAllowance(address,uint256)")), + ("decreaseAllowance", Method(signature: "decreaseAllowance(address,uint256)")), + ("approveAndCall", Method(signature: "approveAndCall(address,uint256,bytes)")) +] + +const ERC721_ENUMERABLE_METHODS = @[ + ("balanceOf", Method(signature: "balanceOf(address)")), + ("ownerOf", Method(signature: "ownerOf(uint256)")), + ("name", Method(signature: "name()")), + ("symbol", Method(signature: "symbol()")), + ("tokenURI", Method(signature: "tokenURI(uint256)")), + ("baseURI", Method(signature: "baseURI()")), + ("tokenOfOwnerByIndex", Method(signature: "tokenOfOwnerByIndex(address,uint256)")), + ("totalSupply", Method(signature: "totalSupply()")), + ("tokenByIndex", Method(signature: "tokenByIndex(uint256)")), + ("approve", Method(signature: "approve(address,uint256)")), + ("getApproved", Method(signature: "getApproved(uint256)")), + ("setApprovalForAll", Method(signature: "setApprovalForAll(address,bool)")), + ("isApprovedForAll", Method(signature: "isApprovedForAll(address,address)")), + ("transferFrom", Method(signature: "transferFrom(address,address,uint256)")), + ("safeTransferFrom", Method(signature: "safeTransferFrom(address,address,uint256)")), + ("safeTransferFromWithData", Method(signature: "safeTransferFrom(address,address,uint256,bytes)")) +] + +type + Contract* = ref object of RootObj + name*: string + network*: Network + address*: Address + methods* {.dontSerialize.}: Table[string, Method] + + Erc20Contract* = ref object of Contract + symbol*: string + decimals*: int + hasIcon* {.dontSerialize.}: bool + color*: string + + Erc721Contract* = ref object of Contract + symbol*: string + hasIcon*: bool + +proc newErc20Contract(name: string, network: Network, address: Address, symbol: string, decimals: int, hasIcon: bool): Erc20Contract = + Erc20Contract(name: name, network: network, address: address, methods: ERC20_METHODS.toTable, symbol: symbol, decimals: decimals, hasIcon: hasIcon) + +proc newErc721Contract(name: string, network: Network, address: Address, symbol: string, hasIcon: bool, addlMethods: seq[tuple[name: string, meth: Method]] = @[]): Erc721Contract = + Erc721Contract(name: name, network: network, address: address, symbol: symbol, hasIcon: hasIcon, methods: ERC721_ENUMERABLE_METHODS.concat(addlMethods).toTable) + + +var ALL_CONTRACTS {.guard: contractsLock.}: seq[Contract] = @[ + # Mainnet contracts + newErc20Contract("Status Network Token", Network.Mainnet, parseAddress("0x744d70fdbe2ba4cf95131626614a1763df805b9e"), "SNT", 18, true), + newErc20Contract("Dai Stablecoin", Network.Mainnet, parseAddress("0x6b175474e89094c44da98b954eedeac495271d0f"), "DAI", 18, true), + newErc20Contract("Sai Stablecoin v1.0", Network.Mainnet, parseAddress("0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359"), "SAI", 18, true), + newErc20Contract("MKR", Network.Mainnet, parseAddress("0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2"), "MKR", 18, true), + newErc20Contract("EOS", Network.Mainnet, parseAddress("0x86fa049857e0209aa7d9e616f7eb3b3b78ecfdb0"), "EOS", 18, true), + newErc20Contract("OMGToken", Network.Mainnet, parseAddress("0xd26114cd6ee289accf82350c8d8487fedb8a0c07"), "OMG", 18, true), + newErc20Contract("Populous Platform", Network.Mainnet, parseAddress("0xd4fa1460f537bb9085d22c7bccb5dd450ef28e3a"), "PPT", 8, true), + newErc20Contract("Reputation", Network.Mainnet, parseAddress("0x1985365e9f78359a9b6ad760e32412f4a445e862"), "REP", 18, true), + newErc20Contract("PowerLedger", Network.Mainnet, parseAddress("0x595832f8fc6bf59c85c527fec3740a1b7a361269"), "POWR", 6, true), + newErc20Contract("TenX Pay Token", Network.Mainnet, parseAddress("0xb97048628db6b661d4c2aa833e95dbe1a905b280"), "PAY", 18, true), + newErc20Contract("Veros", Network.Mainnet, parseAddress("0x92e78dae1315067a8819efd6dca432de9dcde2e9"), "VRS", 6, false), + newErc20Contract("Golem Network Token", Network.Mainnet, parseAddress("0xa74476443119a942de498590fe1f2454d7d4ac0d"), "GNT", 18, true), + newErc20Contract("Salt", Network.Mainnet, parseAddress("0x4156d3342d5c385a87d264f90653733592000581"), "SALT", 8, true), + newErc20Contract("BNB", Network.Mainnet, parseAddress("0xb8c77482e45f1f44de1745f52c74426c631bdd52"), "BNB", 18, true), + newErc20Contract("Basic Attention Token", Network.Mainnet, parseAddress("0x0d8775f648430679a709e98d2b0cb6250d2887ef"), "BAT", 18, true), + newErc20Contract("Kyber Network Crystal", Network.Mainnet, parseAddress("0xdd974d5c2e2928dea5f71b9825b8b646686bd200"), "KNC", 18, true), + newErc20Contract("BTU Protocol", Network.Mainnet, parseAddress("0xb683D83a532e2Cb7DFa5275eED3698436371cc9f"), "BTU", 18, true), + newErc20Contract("Digix DAO", Network.Mainnet, parseAddress("0xe0b7927c4af23765cb51314a0e0521a9645f0e2a"), "DGD", 9, true), + newErc20Contract("Aeternity", Network.Mainnet, parseAddress("0x5ca9a71b1d01849c0a95490cc00559717fcf0d1d"), "AE", 18, true), + newErc20Contract("Tronix", Network.Mainnet, parseAddress("0xf230b790e05390fc8295f4d3f60332c93bed42e2"), "TRX", 6, true), + newErc20Contract("Ethos", Network.Mainnet, parseAddress("0x5af2be193a6abca9c8817001f45744777db30756"), "ETHOS", 8, true), + newErc20Contract("Raiden Token", Network.Mainnet, parseAddress("0x255aa6df07540cb5d3d297f0d0d4d84cb52bc8e6"), "RDN", 18, true), + newErc20Contract("Status Network Token", Network.Mainnet, parseAddress("0x744d70fdbe2ba4cf95131626614a1763df805b9e"), "SNT", 18, true), + newErc20Contract("SingularDTV", Network.Mainnet, parseAddress("0xaec2e87e0a235266d9c5adc9deb4b2e29b54d009"), "SNGLS", 0, true), + newErc20Contract("Gnosis Token", Network.Mainnet, parseAddress("0x6810e776880c02933d47db1b9fc05908e5386b96"), "GNO", 18, true), + newErc20Contract("StorjToken", Network.Mainnet, parseAddress("0xb64ef51c888972c908cfacf59b47c1afbc0ab8ac"), "STORJ", 8, true), + newErc20Contract("AdEx", Network.Mainnet, parseAddress("0x4470bb87d77b963a013db939be332f927f2b992e"), "ADX", 4, false), + newErc20Contract("FunFair", Network.Mainnet, parseAddress("0x419d0d8bdd9af5e606ae2232ed285aff190e711b"), "FUN", 8, true), + newErc20Contract("Civic", Network.Mainnet, parseAddress("0x41e5560054824ea6b0732e656e3ad64e20e94e45"), "CVC", 8, true), + newErc20Contract("ICONOMI", Network.Mainnet, parseAddress("0x888666ca69e0f178ded6d75b5726cee99a87d698"), "ICN", 18, true), + newErc20Contract("Walton Token", Network.Mainnet, parseAddress("0xb7cb1c96db6b22b0d3d9536e0108d062bd488f74"), "WTC", 18, true), + newErc20Contract("Bytom", Network.Mainnet, parseAddress("0xcb97e65f07da24d46bcdd078ebebd7c6e6e3d750"), "BTM", 8, true), + newErc20Contract("0x Protocol Token", Network.Mainnet, parseAddress("0xe41d2489571d322189246dafa5ebde1f4699f498"), "ZRX", 18, true), + newErc20Contract("Bancor Network Token", Network.Mainnet, parseAddress("0x1f573d6fb3f13d689ff844b4ce37794d79a7ff1c"), "BNT", 18, true), + newErc20Contract("Metal", Network.Mainnet, parseAddress("0xf433089366899d83a9f26a773d59ec7ecf30355e"), "MTL", 8, false), + newErc20Contract("PayPie", Network.Mainnet, parseAddress("0xc42209accc14029c1012fb5680d95fbd6036e2a0"), "PPP", 18, true), + newErc20Contract("ChainLink Token", Network.Mainnet, parseAddress("0x514910771af9ca656af840dff83e8264ecf986ca"), "LINK", 18, true), + newErc20Contract("Kin", Network.Mainnet, parseAddress("0x818fc6c2ec5986bc6e2cbf00939d90556ab12ce5"), "KIN", 18, true), + newErc20Contract("Aragon Network Token", Network.Mainnet, parseAddress("0x960b236a07cf122663c4303350609a66a7b288c0"), "ANT", 18, true), + newErc20Contract("MobileGo Token", Network.Mainnet, parseAddress("0x40395044ac3c0c57051906da938b54bd6557f212"), "MGO", 8, true), + newErc20Contract("Monaco", Network.Mainnet, parseAddress("0xb63b606ac810a52cca15e44bb630fd42d8d1d83d"), "MCO", 8, true), + newErc20Contract("loopring", Network.Mainnet, parseAddress("0xef68e7c694f40c8202821edf525de3782458639f"), "LRC", 18, true), + newErc20Contract("Zeus Shield Coin", Network.Mainnet, parseAddress("0x7a41e0517a5eca4fdbc7fbeba4d4c47b9ff6dc63"), "ZSC", 18, true), + newErc20Contract("Streamr DATAcoin", Network.Mainnet, parseAddress("0x0cf0ee63788a0849fe5297f3407f701e122cc023"), "DATA", 18, true), + newErc20Contract("Ripio Credit Network Token", Network.Mainnet, parseAddress("0xf970b8e36e23f7fc3fd752eea86f8be8d83375a6"), "RCN", 18, true), + newErc20Contract("WINGS", Network.Mainnet, parseAddress("0x667088b212ce3d06a1b553a7221e1fd19000d9af"), "WINGS", 18, true), + newErc20Contract("Edgeless", Network.Mainnet, parseAddress("0x08711d3b02c8758f2fb3ab4e80228418a7f8e39c"), "EDG", 0, true), + newErc20Contract("Melon Token", Network.Mainnet, parseAddress("0xbeb9ef514a379b997e0798fdcc901ee474b6d9a1"), "MLN", 18, true), + newErc20Contract("Moeda Loyalty Points", Network.Mainnet, parseAddress("0x51db5ad35c671a87207d88fc11d593ac0c8415bd"), "MDA", 18, true), + newErc20Contract("PILLAR", Network.Mainnet, parseAddress("0xe3818504c1b32bf1557b16c238b2e01fd3149c17"), "PLR", 18, true), + newErc20Contract("QRL", Network.Mainnet, parseAddress("0x697beac28b09e122c4332d163985e8a73121b97f"), "QRL", 8, true), + newErc20Contract("Modum Token", Network.Mainnet, parseAddress("0x957c30ab0426e0c93cd8241e2c60392d08c6ac8e"), "MOD", 0, true), + newErc20Contract("Token-as-a-Service", Network.Mainnet, parseAddress("0xe7775a6e9bcf904eb39da2b68c5efb4f9360e08c"), "TAAS", 6, true), + newErc20Contract("GRID Token", Network.Mainnet, parseAddress("0x12b19d3e2ccc14da04fae33e63652ce469b3f2fd"), "GRID", 12, true), + newErc20Contract("SANtiment network token", Network.Mainnet, parseAddress("0x7c5a0ce9267ed19b22f8cae653f198e3e8daf098"), "SAN", 18, true), + newErc20Contract("SONM Token", Network.Mainnet, parseAddress("0x983f6d60db79ea8ca4eb9968c6aff8cfa04b3c63"), "SNM", 18, true), + newErc20Contract("Request Token", Network.Mainnet, parseAddress("0x8f8221afbb33998d8584a2b05749ba73c37a938a"), "REQ", 18, true), + newErc20Contract("Substratum", Network.Mainnet, parseAddress("0x12480e24eb5bec1a9d4369cab6a80cad3c0a377a"), "SUB", 2, true), + newErc20Contract("Decentraland MANA", Network.Mainnet, parseAddress("0x0f5d2fb29fb7d3cfee444a200298f468908cc942"), "MANA", 18, true), + newErc20Contract("AirSwap Token", Network.Mainnet, parseAddress("0x27054b13b1b798b345b591a4d22e6562d47ea75a"), "AST", 4, true), + newErc20Contract("R token", Network.Mainnet, parseAddress("0x48f775efbe4f5ece6e0df2f7b5932df56823b990"), "R", 0, true), + newErc20Contract("FirstBlood Token", Network.Mainnet, parseAddress("0xaf30d2a7e90d7dc361c8c4585e9bb7d2f6f15bc7"), "1ST", 18, true), + newErc20Contract("Cofoundit", Network.Mainnet, parseAddress("0x12fef5e57bf45873cd9b62e9dbd7bfb99e32d73e"), "CFI", 18, true), + newErc20Contract("Enigma", Network.Mainnet, parseAddress("0xf0ee6b27b759c9893ce4f094b49ad28fd15a23e4"), "ENG", 8, true), + newErc20Contract("Amber Token", Network.Mainnet, parseAddress("0x4dc3643dbc642b72c158e7f3d2ff232df61cb6ce"), "AMB", 18, true), + newErc20Contract("XPlay Token", Network.Mainnet, parseAddress("0x90528aeb3a2b736b780fd1b6c478bb7e1d643170"), "XPA", 18, true), + newErc20Contract("Open Trading Network", Network.Mainnet, parseAddress("0x881ef48211982d01e2cb7092c915e647cd40d85c"), "OTN", 18, true), + newErc20Contract("Trustcoin", Network.Mainnet, parseAddress("0xcb94be6f13a1182e4a4b6140cb7bf2025d28e41b"), "TRST", 6, true), + newErc20Contract("Monolith TKN", Network.Mainnet, parseAddress("0xaaaf91d9b90df800df4f55c205fd6989c977e73a"), "TKN", 8, true), + newErc20Contract("RHOC", Network.Mainnet, parseAddress("0x168296bb09e24a88805cb9c33356536b980d3fc5"), "RHOC", 8, true), + newErc20Contract("Target Coin", Network.Mainnet, parseAddress("0xac3da587eac229c9896d919abc235ca4fd7f72c1"), "TGT", 1, false), + newErc20Contract("Everex", Network.Mainnet, parseAddress("0xf3db5fa2c66b7af3eb0c0b782510816cbe4813b8"), "EVX", 4, true), + newErc20Contract("ICOS", Network.Mainnet, parseAddress("0x014b50466590340d41307cc54dcee990c8d58aa8"), "ICOS", 6, true), + newErc20Contract("district0x Network Token", Network.Mainnet, parseAddress("0x0abdace70d3790235af448c88547603b945604ea"), "DNT", 18, true), + newErc20Contract("Dentacoin", Network.Mainnet, parseAddress("0x08d32b0da63e2c3bcf8019c9c5d849d7a9d791e6"), "٨", 0, false), + newErc20Contract("Eidoo Token", Network.Mainnet, parseAddress("0xced4e93198734ddaff8492d525bd258d49eb388e"), "EDO", 18, true), + newErc20Contract("BitDice", Network.Mainnet, parseAddress("0x29d75277ac7f0335b2165d0895e8725cbf658d73"), "CSNO", 8, false), + newErc20Contract("Cobinhood Token", Network.Mainnet, parseAddress("0xb2f7eb1f2c37645be61d73953035360e768d81e6"), "COB", 18, true), + newErc20Contract("Enjin Coin", Network.Mainnet, parseAddress("0xf629cbd94d3791c9250152bd8dfbdf380e2a3b9c"), "ENJ", 18, false), + newErc20Contract("AVENTUS", Network.Mainnet, parseAddress("0x0d88ed6e74bbfd96b831231638b66c05571e824f"), "AVT", 18, false), + newErc20Contract("Chronobank TIME", Network.Mainnet, parseAddress("0x6531f133e6deebe7f2dce5a0441aa7ef330b4e53"), "TIME", 8, false), + newErc20Contract("Cindicator Token", Network.Mainnet, parseAddress("0xd4c435f5b09f855c3317c8524cb1f586e42795fa"), "CND", 18, true), + newErc20Contract("Stox", Network.Mainnet, parseAddress("0x006bea43baa3f7a6f765f14f10a1a1b08334ef45"), "STX", 18, true), + newErc20Contract("Xaurum", Network.Mainnet, parseAddress("0x4df812f6064def1e5e029f1ca858777cc98d2d81"), "XAUR", 8, true), + newErc20Contract("Vibe", Network.Mainnet, parseAddress("0x2c974b2d0ba1716e644c1fc59982a89ddd2ff724"), "VIB", 18, true), + newErc20Contract("PRG", Network.Mainnet, parseAddress("0x7728dfef5abd468669eb7f9b48a7f70a501ed29d"), "PRG", 6, false), + newErc20Contract("Delphy Token", Network.Mainnet, parseAddress("0x6c2adc2073994fb2ccc5032cc2906fa221e9b391"), "DPY", 18, true), + newErc20Contract("CoinDash Token", Network.Mainnet, parseAddress("0x2fe6ab85ebbf7776fee46d191ee4cea322cecf51"), "CDT", 18, true), + newErc20Contract("Tierion Network Token", Network.Mainnet, parseAddress("0x08f5a9235b08173b7569f83645d2c7fb55e8ccd8"), "TNT", 8, true), + newErc20Contract("DomRaiderToken", Network.Mainnet, parseAddress("0x9af4f26941677c706cfecf6d3379ff01bb85d5ab"), "DRT", 8, true), + newErc20Contract("SPANK", Network.Mainnet, parseAddress("0x42d6622dece394b54999fbd73d108123806f6a18"), "SPANK", 18, true), + newErc20Contract("Berlin Coin", Network.Mainnet, parseAddress("0x80046305aaab08f6033b56a360c184391165dc2d"), "BRLN", 18, true), + newErc20Contract("USD//C", Network.Mainnet, parseAddress("0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"), "USDC", 6, true), + newErc20Contract("Livepeer Token", Network.Mainnet, parseAddress("0x58b6a8a3302369daec383334672404ee733ab239"), "LPT", 18, true), + newErc20Contract("Simple Token", Network.Mainnet, parseAddress("0x2c4e8f2d746113d0696ce89b35f0d8bf88e0aeca"), "ST", 18, true), + newErc20Contract("Wrapped BTC", Network.Mainnet, parseAddress("0x2260fac5e5542a773aa44fbcfedf7c193bc2c599"), "WBTC", 8, true), + newErc20Contract("Bloom Token", Network.Mainnet, parseAddress("0x107c4504cd79c5d2696ea0030a8dd4e92601b82e"), "BLT", 18, true), Contract(name: "stickers", network: Network.Mainnet, address: parseAddress("0x0577215622f43a39f4bc9640806dfea9b10d2a36"), methods: [ ("packCount", Method(signature: "packCount()")), ("getPackData", Method(signature: "getPackData(uint256)")) ].toTable ), - Contract(name: "stickers", network: Network.Testnet, address: parseAddress("0x8cc272396be7583c65bee82cd7b743c69a87287d"), - methods: [ - ("packCount", Method(signature: "packCount()")), - ("getPackData", Method(signature: "getPackData(uint256)")) - ].toTable - ), Contract(name: "sticker-market", network: Network.Mainnet, address: parseAddress("0x12824271339304d3a9f7e096e62a2a7e73b4a7e7"), methods: [ ("buyToken", Method(signature: "buyToken(uint256,address,uint256)")) ].toTable ), - Contract(name: "sticker-market", network: Network.Testnet, address: parseAddress("0x6CC7274aF9cE9572d22DFD8545Fb8c9C9Bcb48AD"), - methods: [ - ("buyToken", Method(signature: "buyToken(uint256,address,uint256)")) - ].toTable - ), - Contract(name: "sticker-pack", network: Network.Mainnet, address: parseAddress("0x110101156e8F0743948B2A61aFcf3994A8Fb172e"), - methods: [ - ("balanceOf", Method(signature: "balanceOf(address)")), - ("tokenOfOwnerByIndex", Method(signature: "tokenOfOwnerByIndex(address,uint256)")), - ("tokenPackId", Method(signature: "tokenPackId(uint256)")) - ].toTable - ), - Contract(name: "sticker-pack", network: Network.Testnet, address: parseAddress("0xf852198d0385c4b871e0b91804ecd47c6ba97351"), - methods: [ - ("balanceOf", Method(signature: "balanceOf(address)")), - ("tokenOfOwnerByIndex", Method(signature: "tokenOfOwnerByIndex(address,uint256)")), - ("tokenPackId", Method(signature: "tokenPackId(uint256)")) - ].toTable), + newErc721Contract("sticker-pack", Network.Mainnet, parseAddress("0x110101156e8F0743948B2A61aFcf3994A8Fb172e"), "PACK", false, @[("tokenPackId", Method(signature: "tokenPackId(uint256)"))]), # Strikers seems dead. Their website doesn't work anymore - Contract(name: "strikers", network: Network.Mainnet, address: parseAddress("0xdcaad9fd9a74144d226dbf94ce6162ca9f09ed7e"), - methods: [ - ("tokenOfOwnerByIndex", Method(signature: "tokenOfOwnerByIndex(address,uint256)")) - ].toTable - ), - Contract(name: "ethermon", network: Network.Mainnet, address: parseAddress("0xb2c0782ae4a299f7358758b2d15da9bf29e1dd99"), - methods: [ - ("tokenOfOwnerByIndex", Method(signature: "tokenOfOwnerByIndex(address,uint256)")) - ].toTable - ), - Contract(name: "kudos", network: Network.Mainnet, address: parseAddress("0x2aea4add166ebf38b63d09a75de1a7b94aa24163"), - methods: [ - ("tokenOfOwnerByIndex", Method(signature: "tokenOfOwnerByIndex(address,uint256)")), - ("tokenURI", Method(signature: "tokenURI(uint256)")) - ].toTable - ), - Contract(name: "kudos", network: Network.Testnet, address: parseAddress("0xcd520707fc68d153283d518b29ada466f9091ea8"), - methods: [ - ("tokenOfOwnerByIndex", Method(signature: "tokenOfOwnerByIndex(address,uint256)")), - ("tokenURI", Method(signature: "tokenURI(uint256)")) - ].toTable - ), - Contract(name: "crypto-kitties", network: Network.Mainnet, address: parseAddress("0x06012c8cf97bead5deae237070f9587f8e7a266d")), + newErc721Contract("strikers", Network.Mainnet, parseAddress("0xdcaad9fd9a74144d226dbf94ce6162ca9f09ed7e"), "STRK", true), + newErc721Contract("ethermon", Network.Mainnet, parseAddress("0xb2c0782ae4a299f7358758b2d15da9bf29e1dd99"), "EMONA", true), + newErc721Contract("kudos", Network.Mainnet, parseAddress("0x2aea4add166ebf38b63d09a75de1a7b94aa24163"), "KDO", true), + newErc721Contract("crypto-kitties", Network.Mainnet, parseAddress("0x06012c8cf97bead5deae237070f9587f8e7a266d"), "CK", true), Contract(name: "ens-usernames", network: Network.Mainnet, address: parseAddress("0xDB5ac1a559b02E12F29fC0eC0e37Be8E046DEF49"), methods: [ ("register", Method(signature: "register(bytes32,address,bytes32,bytes32)")), ("getPrice", Method(signature: "getPrice()")) ].toTable ), - Contract(name: "ens-usernames", network: Network.Testnet, address: parseAddress("0x11d9F481effd20D76cEE832559bd9Aca25405841"), - methods: [ - ("register", Method(signature: "register(bytes32,address,bytes32,bytes32)")), - ("getPrice", Method(signature: "getPrice()")) - ].toTable - ), Contract(name: "ens-resolver", network: Network.Mainnet, address: parseAddress("0x4976fb03C32e5B8cfe2b6cCB31c09Ba78EBaBa41"), methods: [ ("setPubkey", Method(signature: "setPubkey(bytes32,bytes32,bytes32)")) ].toTable ), + + # Testnet (Ropsten) contracts + newErc20Contract("Status Test Token", Network.Testnet, parseAddress("0xc55cf4b03948d7ebc8b9e8bad92643703811d162"), "STT", 18, true), + newErc20Contract("Handy Test Token", Network.Testnet, parseAddress("0xdee43a267e8726efd60c2e7d5b81552dcd4fa35c"), "HND", 0, false), + newErc20Contract("Lucky Test Token", Network.Testnet, parseAddress("0x703d7dc0bc8e314d65436adf985dda51e09ad43b"), "LXS", 2, false), + newErc20Contract("Adi Test Token", Network.Testnet, parseAddress("0xe639e24346d646e927f323558e6e0031bfc93581"), "ADI", 7, false), + newErc20Contract("Wagner Test Token", Network.Testnet, parseAddress("0x2e7cd05f437eb256f363417fd8f920e2efa77540"), "WGN", 10, false), + newErc20Contract("Modest Test Token", Network.Testnet, parseAddress("0x57cc9b83730e6d22b224e9dc3e370967b44a2de0"), "MDS", 18, false), + Contract(name: "tribute-to-talk", network: Network.Testnet, address: parseAddress("0xC61aa0287247a0398589a66fCD6146EC0F295432")), + Contract(name: "stickers", network: Network.Testnet, address: parseAddress("0x8cc272396be7583c65bee82cd7b743c69a87287d"), + methods: [ + ("packCount", Method(signature: "packCount()")), + ("getPackData", Method(signature: "getPackData(uint256)")) + ].toTable + ), + Contract(name: "sticker-market", network: Network.Testnet, address: parseAddress("0x6CC7274aF9cE9572d22DFD8545Fb8c9C9Bcb48AD"), + methods: [ + ("buyToken", Method(signature: "buyToken(uint256,address,uint256)")) + ].toTable + ), + newErc721Contract("sticker-pack", Network.Testnet, parseAddress("0xf852198d0385c4b871e0b91804ecd47c6ba97351"), "PACK", false, @[("tokenPackId", Method(signature: "tokenPackId(uint256)"))]), + newErc721Contract("kudos", Network.Testnet, parseAddress("0xcd520707fc68d153283d518b29ada466f9091ea8"), "KDO", true), + Contract(name: "ens-usernames", network: Network.Testnet, address: parseAddress("0x11d9F481effd20D76cEE832559bd9Aca25405841"), + methods: [ + ("register", Method(signature: "register(bytes32,address,bytes32,bytes32)")), + ("getPrice", Method(signature: "getPrice()")) + ].toTable + ), Contract(name: "ens-resolver", network: Network.Testnet, address: parseAddress("0x42D63ae25990889E35F215bC95884039Ba354115"), methods: [ ("setPubkey", Method(signature: "setPubkey(bytes32,bytes32,bytes32)")) ].toTable ), + + # Rinkeby contracts + newErc20Contract("Moksha Coin", Network.Rinkeby, parseAddress("0x6ba7dc8dd10880ab83041e60c4ede52bb607864b"), "MOKSHA", 18, false), + newErc20Contract("WIBB", Network.Rinkeby, parseAddress("0x7d4ccf6af2f0fdad48ee7958bcc28bdef7b732c7"), "WIBB", 18, false), + newErc20Contract("Status Test Token", Network.Rinkeby, parseAddress("0x43d5adc3b49130a575ae6e4b00dfa4bc55c71621"), "STT", 18, false), + + # xDai contracts + newErc20Contract("buffiDai", Network.XDai, parseAddress("0x3e50bf6703fc132a94e4baff068db2055655f11b"), "BUFF", 18, false), ] proc getContract(network: Network, name: string): Contract = - let found = allContracts().filter(contract => contract.name == name and contract.network == network) - result = if found.len > 0: found[0] else: nil + {.gcsafe.}: + withLock contractsLock: + let found = ALL_CONTRACTS.filter(contract => contract.name == name and contract.network == network) + result = if found.len > 0: found[0] else: nil proc getContract*(name: string): Contract = let network = settings.getCurrentNetwork() getContract(network, name) + +proc getErc20ContractBySymbol*(contracts: seq[Erc20Contract], symbol: string): Erc20Contract = + let found = contracts.filter(contract => contract.symbol.toLower == symbol.toLower) + result = if found.len > 0: found[0] else: nil + +proc getErc20ContractByAddress*(contracts: seq[Erc20Contract], address: Address): Erc20Contract = + let found = contracts.filter(contract => contract.address == address) + result = if found.len > 0: found[0] else: nil + +proc getErc20Contract*(symbol: string): Erc20Contract = + let network = settings.getCurrentNetwork() + {.gcsafe.}: + withLock contractsLock: + result = ALL_CONTRACTS.filter(contract => contract.network == network and contract of Erc20Contract).map(contract => Erc20Contract(contract)).getErc20ContractBySymbol(symbol) + +proc getErc20Contract*(address: Address): Erc20Contract = + let network = settings.getCurrentNetwork() + {.gcsafe.}: + withLock contractsLock: + result = ALL_CONTRACTS.filter(contract => contract.network == network and contract of Erc20Contract).map(contract => Erc20Contract(contract)).getErc20ContractByAddress(address) + +proc getErc20Contracts*(): seq[Erc20Contract] = + let network = settings.getCurrentNetwork() + {.gcsafe.}: + withLock contractsLock: + result = ALL_CONTRACTS.filter(contract => contract of Erc20Contract and contract.network == network).map(contract => Erc20Contract(contract)) + +proc getErc721Contract(network: Network, name: string): Erc721Contract = + {.gcsafe.}: + withLock contractsLock: + let found = ALL_CONTRACTS.filter(contract => contract of Erc721Contract and Erc721Contract(contract).name.toLower == name.toLower and contract.network == network) + result = if found.len > 0: Erc721Contract(found[0]) else: nil + +proc getErc721Contract*(name: string): Erc721Contract = + let network = settings.getCurrentNetwork() + getErc721Contract(network, name) + +proc getErc721Contracts*(): seq[Erc721Contract] = + let network = settings.getCurrentNetwork() + {.gcsafe.}: + withLock contractsLock: + result = ALL_CONTRACTS.filter(contract => contract of Erc721Contract and contract.network == network).map(contract => Erc721Contract(contract)) + +proc getSntContract*(): Erc20Contract = + if settings.getCurrentNetwork() == Network.Mainnet: + result = getErc20Contract("snt") + else: + result = getErc20Contract("stt") + if result == nil: + # TODO: xDai network does not have an SNT contract listed. We will need to handle + # having no SNT contract in other places in the code (ie anywhere that + # getSntContract() is called) + raise newException(ValueError, "A status contract could not be found for the current network") \ No newline at end of file diff --git a/src/status/libstatus/stickers.nim b/src/status/libstatus/stickers.nim index 17ff899134..9e316fefa1 100644 --- a/src/status/libstatus/stickers.nim +++ b/src/status/libstatus/stickers.nim @@ -1,8 +1,8 @@ import ./core as status, ./types, ./eth/contracts, ./settings, ./edn_helpers import - json, json_serialization, tables, chronicles, strutils, sequtils, httpclient, + json, json_serialization, tables, chronicles, sequtils, httpclient, stint, libp2p/[multihash, multicodec, cid], web3/[ethtypes, conversions] -from strutils import parseHexInt +from strutils import parseHexInt, parseInt from nimcrypto import fromHex proc decodeContentHash*(value: string): string = @@ -71,7 +71,7 @@ proc getBalance*(address: Address): int = raise newException(RpcException, "Error getting stickers balance: " & response.error.message) if response.result == "0x": return 0 - result = fromHex[int](response.result) + result = parseHexInt(response.result) # Gets number of sticker packs proc getPackCount*(): int = @@ -87,7 +87,7 @@ proc getPackCount*(): int = raise newException(RpcException, "Error getting stickers balance: " & response.error.message) if response.result == "0x": return 0 - result = fromHex[int](response.result) + result = parseHexInt(response.result) # Gets sticker pack data proc getPackData*(id: Stuint[256]): StickerPack = @@ -139,7 +139,7 @@ proc tokenOfOwnerByIndex*(address: Address, idx: Stuint[256]): int = raise newException(RpcException, "Error getting owned tokens: " & response.error.message) if response.result == "0x": return 0 - result = fromHex[int](response.result) + result = parseHexInt(response.result) proc getPackIdFromTokenId*(tokenId: Stuint[256]): int = let @@ -156,7 +156,7 @@ proc getPackIdFromTokenId*(tokenId: Stuint[256]): int = raise newException(RpcException, "Error getting pack id from token id: " & response.error.message) if response.result == "0x": return 0 - result = fromHex[int](response.result) + result = parseHexInt(response.result) proc saveInstalledStickerPacks*(installedStickerPacks: Table[int, StickerPack]) = let json = %* {} diff --git a/src/status/libstatus/tokens.nim b/src/status/libstatus/tokens.nim index e8d86199d4..1878970ac8 100644 --- a/src/status/libstatus/tokens.nim +++ b/src/status/libstatus/tokens.nim @@ -4,9 +4,8 @@ import ./eth/contracts import web3/[ethtypes, conversions] import json_serialization import settings -from types import Setting, Network -import default_tokens -import strutils +from types import Setting, Network, RpcResponse, RpcException +from utils import parseAddress import locks logScope: @@ -15,80 +14,73 @@ logScope: var customTokensLock: Lock initLock(customTokensLock) -var customTokens {.guard: customTokensLock.} = %*{} +var customTokens {.guard: customTokensLock.}: seq[Erc20Contract] = @[] var dirty {.guard: customTokensLock.} = true -proc getCustomTokens*(useCached: bool = true): JsonNode = +proc getCustomTokens*(useCached: bool = true): seq[Erc20Contract] = {.gcsafe.}: withLock customTokensLock: if useCached and not dirty: result = customTokens else: let payload = %* [] - result = callPrivateRPC("wallet_getCustomTokens", payload).parseJSON()["result"] - if result.kind == JNull: result = %* [] + let responseStr = callPrivateRPC("wallet_getCustomTokens", payload) + # TODO: this should be handled in the deserialisation of RpcResponse, + # question has been posed: https://discordapp.com/channels/613988663034118151/616299964242460682/762828178624217109 + let response = RpcResponse(result: $(responseStr.parseJSON()["result"])) + if not response.error.isNil: + raise newException(RpcException, "Error getting custom tokens: " & response.error.message) + result = if response.result == "null": @[] else: Json.decode(response.result, seq[Erc20Contract]) dirty = false customTokens = result -proc getTokenBySymbol*(tokenList: JsonNode, symbol: string): JsonNode = - for defToken in tokenList.getElems(): - if defToken["symbol"].getStr == symbol: - return defToken - return newJNull() - -proc getTokenByAddress*(tokenList: JsonNode, address: string): JsonNode = - for defToken in tokenList.getElems(): - if defToken["address"].getStr == address: - return defToken - return newJNull() - proc visibleTokensSNTDefault(): JsonNode = - let currentNetwork = getSetting[string](Setting.Networks_CurrentNetwork) - let SNT = if getCurrentNetwork() == Network.Testnet: "STT" else: "SNT" + let currentNetwork = getCurrentNetwork() + let SNT = if currentNetwork == Network.Testnet: "STT" else: "SNT" let response = getSetting[string](Setting.VisibleTokens, "{}").parseJSON - if response.hasKey(currentNetwork): return response - - # Set STT/SNT visible by default - response[currentNetwork] = %* [SNT] + if not response.hasKey($currentNetwork): + # Set STT/SNT visible by default + response[$currentNetwork] = %* [SNT] + return response proc toggleAsset*(symbol: string) = - let currentNetwork = getSetting[string](Setting.Networks_CurrentNetwork) + let currentNetwork = getCurrentNetwork() let visibleTokens = visibleTokensSNTDefault() - var visibleTokenList = visibleTokens[currentNetwork].to(seq[string]) - var symbolIdx = visibleTokenList.find(symbol) + var visibleTokenList = visibleTokens[$currentNetwork].to(seq[string]) + let symbolIdx = visibleTokenList.find(symbol) if symbolIdx > -1: visibleTokenList.del(symbolIdx) else: visibleTokenList.add symbol - visibleTokens[currentNetwork] = newJArray() - visibleTokens[currentNetwork] = %* visibleTokenList + visibleTokens[$currentNetwork] = newJArray() + visibleTokens[$currentNetwork] = %* visibleTokenList discard saveSetting(Setting.VisibleTokens, $visibleTokens) proc hideAsset*(symbol: string) = - let currentNetwork = getSetting[string](Setting.Networks_CurrentNetwork) + let currentNetwork = getCurrentNetwork() let visibleTokens = visibleTokensSNTDefault() - var visibleTokenList = visibleTokens[currentNetwork].to(seq[string]) + var visibleTokenList = visibleTokens[$currentNetwork].to(seq[string]) var symbolIdx = visibleTokenList.find(symbol) if symbolIdx > -1: visibleTokenList.del(symbolIdx) - visibleTokens[currentNetwork] = newJArray() - visibleTokens[currentNetwork] = %* visibleTokenList + visibleTokens[$currentNetwork] = newJArray() + visibleTokens[$currentNetwork] = %* visibleTokenList discard saveSetting(Setting.VisibleTokens, $visibleTokens) -proc getVisibleTokens*(): JsonNode = - let currentNetwork = getSetting[string](Setting.Networks_CurrentNetwork) +proc getVisibleTokens*(): seq[Erc20Contract] = + let currentNetwork = getCurrentNetwork() let visibleTokens = visibleTokensSNTDefault() - let visibleTokenList = visibleTokens[currentNetwork].to(seq[string]) + var visibleTokenList = visibleTokens[$currentNetwork].to(seq[string]) let customTokens = getCustomTokens() - result = newJArray() + result = @[] for v in visibleTokenList: - let t = getTokenBySymbol(getDefaultTokens(), v) - if t.kind != JNull: result.elems.add(t) - let ct = getTokenBySymbol(getCustomTokens(), v) - if ct.kind != JNull: result.elems.add(ct) + let t = getErc20Contract(v) + if t != nil: result.add t + let ct = customTokens.getErc20ContractBySymbol(v) + if ct != nil: result.add ct proc addCustomToken*(address: string, name: string, symbol: string, decimals: int, color: string) = let payload = %* [{"address": address, "name": name, "symbol": symbol, "decimals": decimals, "color": color}] @@ -119,19 +111,20 @@ proc getTokenBalance*(tokenAddress: string, account: string): string = let balance = response.parseJson["result"].getStr var decimals = 18 - let t = getTokenByAddress(getDefaultTokens(), tokenAddress) - let ct = getTokenByAddress(getCustomTokens(), tokenAddress) - if t.kind != JNull: - decimals = t["decimals"].getInt - elif ct.kind != JNull: - decimals = ct["decimals"].getInt + let address = parseAddress(tokenAddress) + let t = getErc20Contract(address) + let ct = getCustomTokens().getErc20ContractByAddress(address) + if t != nil: + decimals = t.decimals + elif ct != nil: + decimals = ct.decimals result = $hex2Token(balance, decimals) proc getSNTAddress*(): string = - let snt = contracts.getContract("snt") - result = "0x" & $snt.address + let snt = contracts.getSntContract() + result = $snt.address proc getSNTBalance*(account: string): string = - let snt = contracts.getContract("snt") - result = getTokenBalance("0x" & $snt.address, account) + let snt = contracts.getSntContract() + result = getTokenBalance($snt.address, account) diff --git a/src/status/libstatus/types.nim b/src/status/libstatus/types.nim index 2e827986fb..2f5a8a03ea 100644 --- a/src/status/libstatus/types.nim +++ b/src/status/libstatus/types.nim @@ -139,13 +139,13 @@ proc readValue*(reader: var JsonReader, value: var Stuint[256]) type Network* {.pure.} = enum - Mainnet, - Testnet, - Rinkeby, - Goerli, - XDai, - Poa, - Other + Mainnet = "mainnet_rpc", + Testnet = "testnet_rpc", + Rinkeby = "rinkeby_rpc", + Goerli = "goerli_rpc", + XDai = "xdai_rpc", + Poa = "poa_rpc", + Other = "other" Setting* {.pure.} = enum Appearance = "appearance", diff --git a/src/status/stickers.nim b/src/status/stickers.nim index 500080e564..c1c00fd7ca 100644 --- a/src/status/stickers.nim +++ b/src/status/stickers.nim @@ -42,8 +42,8 @@ proc init*(self: StickersModel) = var evArgs = StickerArgs(e) self.addStickerToRecent(evArgs.sticker, evArgs.save) -proc buildTransaction(self: StickersModel, packId: Uint256, address: Address, price: Uint256, approveAndCall: var ApproveAndCall[100], sntContract: var Contract, gas = "", gasPrice = ""): EthSend = - sntContract = status_contracts.getContract("snt") +proc buildTransaction(self: StickersModel, packId: Uint256, address: Address, price: Uint256, approveAndCall: var ApproveAndCall[100], sntContract: var Erc20Contract, gas = "", gasPrice = ""): EthSend = + sntContract = status_contracts.getSntContract() let stickerMktContract = status_contracts.getContract("sticker-market") buyToken = BuyToken(packId: packId, address: address, price: price) @@ -54,7 +54,7 @@ proc buildTransaction(self: StickersModel, packId: Uint256, address: Address, pr proc estimateGas*(self: StickersModel, packId: int, address: string, price: string, success: var bool): int = var approveAndCall: ApproveAndCall[100] - sntContract = status_contracts.getContract("snt") + sntContract = status_contracts.getSntContract() tx = self.buildTransaction( packId.u256, parseAddress(address), @@ -68,7 +68,7 @@ proc estimateGas*(self: StickersModel, packId: int, address: string, price: stri proc buyPack*(self: StickersModel, packId: int, address, price, gas, gasPrice, password: string, success: var bool): string = var - sntContract: Contract + sntContract: Erc20Contract approveAndCall: ApproveAndCall[100] tx = self.buildTransaction( packId.u256, diff --git a/src/status/wallet.nim b/src/status/wallet.nim index 28fa47c6a9..f1603911e1 100644 --- a/src/status/wallet.nim +++ b/src/status/wallet.nim @@ -33,7 +33,7 @@ type WalletModel* = ref object events*: EventEmitter accounts*: seq[WalletAccount] defaultCurrency*: string - tokens*: JsonNode + tokens*: seq[Erc20Contract] totalBalance*: float proc getDefaultCurrency*(self: WalletModel): string @@ -42,7 +42,7 @@ proc calculateTotalFiatBalance*(self: WalletModel) proc newWalletModel*(events: EventEmitter): WalletModel = result = WalletModel() result.accounts = @[] - result.tokens = %* [] + result.tokens = @[] result.events = events result.defaultCurrency = "" result.totalBalance = 0.0 @@ -61,10 +61,9 @@ proc initEvents*(self: WalletModel) = proc delete*(self: WalletModel) = discard -proc buildTokenTransaction(self: WalletModel, source, to, assetAddress: Address, value: float, transfer: var Transfer, contract: var Contract, gas = "", gasPrice = ""): EthSend = - let token = self.tokens.first("address", $assetAddress) - contract = getContract("snt") - transfer = Transfer(to: to, value: eth2Wei(value, token["decimals"].getInt)) +proc buildTokenTransaction(self: WalletModel, source, to, assetAddress: Address, value: float, transfer: var Transfer, contract: var Erc20Contract, gas = "", gasPrice = ""): EthSend = + contract = getErc20Contract(assetAddress) + transfer = Transfer(to: to, value: eth2Wei(value, contract.decimals)) transactions.buildTokenTransaction(source, assetAddress, gas, gasPrice) proc estimateGas*(self: WalletModel, source, to, value: string, success: var bool): int = @@ -102,7 +101,7 @@ proc checkPendingTransactions*(self: WalletModel, address: string, blockNumber: proc estimateTokenGas*(self: WalletModel, source, to, assetAddress, value: string, success: var bool): int = var transfer: Transfer - contract: Contract + contract: Erc20Contract tx = self.buildTokenTransaction( parseAddress(source), parseAddress(to), @@ -129,7 +128,7 @@ proc sendTransaction*(self: WalletModel, source, to, value, gas, gasPrice, passw proc sendTokenTransaction*(self: WalletModel, source, to, assetAddress, value, gas, gasPrice, password: string, success: var bool): string = var transfer: Transfer - contract: Contract + contract: Erc20Contract tx = self.buildTokenTransaction( parseAddress(source), parseAddress(to), @@ -153,13 +152,12 @@ proc getDefaultCurrency*(self: WalletModel): string = # TODO: This needs to be removed or refactored so that test tokens are shown # when on testnet https://github.com/status-im/nim-status-client/issues/613. proc getStatusToken*(self: WalletModel): string = - var token = Asset(address: $getContract("snt").address) - if status_settings.getCurrentNetwork() == Network.Testnet: - token.name = "Status Test Token" - token.symbol = "STT" - else: - token.name = "Status Network Token" - token.symbol = "SNT" + var + token = Asset() + erc20Contract = getSntContract() + token.name = erc20Contract.name + token.symbol = erc20Contract.symbol + token.address = $erc20Contract.address result = $(%token) proc setDefaultCurrency*(self: WalletModel, currency: string) = @@ -171,8 +169,8 @@ proc generateAccountConfiguredAssets*(self: WalletModel, accountAddress: string) var asset = Asset(name:"Ethereum", symbol: "ETH", value: "0.0", fiatBalanceDisplay: "0.0", accountAddress: accountAddress) assets.add(asset) for token in self.tokens: - var symbol = token["symbol"].getStr - var existingToken = Asset(name: token["name"].getStr, symbol: symbol, value: fmt"0.0", fiatBalanceDisplay: "$0.0", accountAddress: accountAddress, address: token["address"].getStr) + var symbol = token.symbol + var existingToken = Asset(name: token.name, symbol: symbol, value: fmt"0.0", fiatBalanceDisplay: "$0.0", accountAddress: accountAddress, address: $token.address) assets.add(existingToken) assets @@ -271,7 +269,7 @@ proc addWatchOnlyAccount*(self: WalletModel, address: string, accountName: strin proc hasAsset*(self: WalletModel, account: string, symbol: string): bool = self.tokens = status_tokens.getVisibleTokens() - self.tokens.anyIt(it["symbol"].getStr == symbol) + self.tokens.anyIt(it.symbol == symbol) proc changeAccountSettings*(self: WalletModel, address: string, accountName: string, color: string): string = var selectedAccount: WalletAccount diff --git a/src/status/wallet/collectibles.nim b/src/status/wallet/collectibles.nim index 1946e69384..e30c632cdd 100644 --- a/src/status/wallet/collectibles.nim +++ b/src/status/wallet/collectibles.nim @@ -16,7 +16,7 @@ const COLLECTIBLE_TYPES* = [CRYPTOKITTY, KUDO, ETHERMON, STICKER] const MAX_TOKENS = 200 -proc getTokenUri(contract: Contract, tokenId: Stuint[256]): string = +proc getTokenUri(contract: Erc721Contract, tokenId: Stuint[256]): string = try: let tokenUri = TokenUri(tokenId: tokenId) @@ -37,7 +37,7 @@ proc getTokenUri(contract: Contract, tokenId: Stuint[256]): string = error "Error getting the token URI", mes = e.msg result = "" -proc tokenOfOwnerByIndex(contract: Contract, address: Address, index: Stuint[256]): int = +proc tokenOfOwnerByIndex(contract: Erc721Contract, address: Address, index: Stuint[256]): int = let tokenOfOwnerByIndex = TokenOfOwnerByIndex(address: address, index: index) payload = %* [{ @@ -50,7 +50,7 @@ proc tokenOfOwnerByIndex(contract: Contract, address: Address, index: Stuint[256 return -1 result = fromHex[int](res) -proc tokensOfOwnerByIndex(contract: Contract, address: Address): seq[int] = +proc tokensOfOwnerByIndex(contract: Erc721Contract, address: Address): seq[int] = var index = 0 var token: int result = @[] @@ -117,7 +117,7 @@ proc getEthermons*(address: Address): string = try: var ethermons: seq[Collectible] ethermons = @[] - let contract = getContract("ethermon") + let contract = getErc721Contract("ethermon") if contract == nil: return $(%*ethermons) let tokens = tokensOfOwnerByIndex(contract, address) @@ -156,7 +156,7 @@ proc getKudos*(address: Address): string = try: var kudos: seq[Collectible] kudos = @[] - let contract = getContract("kudos") + let contract = getErc721Contract("kudos") if contract == nil: return $(%*kudos) let tokens = tokensOfOwnerByIndex(contract, address) @@ -196,7 +196,7 @@ proc getStickers*(address: Address): string = try: var stickers: seq[Collectible] stickers = @[] - let contract = getContract("sticker-pack") + let contract = getErc721Contract("sticker-pack") if contract == nil: return let tokensIds = tokensOfOwnerByIndex(contract, address)