diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b986336 --- /dev/null +++ b/.gitignore @@ -0,0 +1,17 @@ +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Dependency directories (remove the comment below to include it) +# vendor/ + +.idea/ \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..ecdcead --- /dev/null +++ b/Makefile @@ -0,0 +1,6 @@ +GOBASE := $(shell pwd) +GOBIN := $(GOBASE)/bin + +generate-coins: + @echo " > Generating coin file" + GOBIN=$(GOBIN) go run -tags=coins coin/gen.go diff --git a/coin/coins.go b/coin/coins.go new file mode 100644 index 0000000..e27358a --- /dev/null +++ b/coin/coins.go @@ -0,0 +1,763 @@ +// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots at +// 2020-10-21 11:54:31.70677 -0700 PDT m=+0.001594863 +// using data from coins.yml +package coin + +import ( + "fmt" +) + +// Coin is the native currency of a blockchain +type Coin struct { + ID uint + Handle string + Symbol string + PreferedSymbol string + Name string + Decimals uint + BlockTime int + MinConfirmations int64 + SampleAddr string +} + +func (c *Coin) String() string { + return fmt.Sprintf("[%s] %s (#%d)", c.Symbol, c.Name, c.ID) +} + +const ( + ETH = 60 + ETC = 61 + ICX = 74 + ATOM = 118 + XRP = 144 + XLM = 148 + POA = 178 + TRX = 195 + FIO = 235 + NIM = 242 + IOTX = 304 + ZIL = 313 + AION = 425 + AE = 457 + KAVA = 459 + THETA = 500 + BNB = 714 + VET = 818 + CLO = 820 + TOMO = 889 + TT = 1001 + ONT = 1024 + XTZ = 1729 + KIN = 2017 + NAS = 2718 + GO = 6060 + WAN = 5718350 + WAVES = 5741564 + BTC = 0 + LTC = 2 + DOGE = 3 + DASH = 5 + VIA = 14 + GRS = 17 + ZEC = 133 + XZC = 136 + BCH = 145 + RVN = 175 + QTUM = 2301 + ZEL = 19167 + DCR = 42 + ALGO = 283 + NANO = 165 + DGB = 20 + ONE = 1023 + KSM = 434 + DOT = 354 + SOL = 501 + NEAR = 397 + ERD = 508 + BSCLegacy = 10000714 + BSC = 20000714 +) + +var Coins = map[uint]Coin{ + ETH: { + ID: 60, + Handle: "ethereum", + Symbol: "ETH", + Name: "Ethereum", + Decimals: 18, + BlockTime: 10000, + MinConfirmations: 0, + SampleAddr: "0xfc10cab6a50a1ab10c56983c80cc82afc6559cf1", + }, + ETC: { + ID: 61, + Handle: "classic", + Symbol: "ETC", + Name: "Ethereum Classic", + Decimals: 18, + BlockTime: 30000, + MinConfirmations: 0, + SampleAddr: "0xf3524415b6D873205B4c3Cda783527b2aC4daAA9", + }, + ICX: { + ID: 74, + Handle: "icon", + Symbol: "ICX", + Name: "ICON", + Decimals: 18, + BlockTime: 0, + MinConfirmations: 0, + SampleAddr: "hxee691e7bccc4eb11fee922896e9f51490e62b12e", + }, + ATOM: { + ID: 118, + Handle: "cosmos", + Symbol: "ATOM", + Name: "Cosmos", + Decimals: 6, + BlockTime: 5000, + MinConfirmations: 0, + SampleAddr: "cosmos1rw62phusuv9vzraezr55k0vsqssvz6ed52zyrl", + }, + XRP: { + ID: 144, + Handle: "ripple", + Symbol: "XRP", + Name: "Ripple", + Decimals: 6, + BlockTime: 5000, + MinConfirmations: 0, + SampleAddr: "rMQ98K56yXJbDGv49ZSmW51sLn94Xe1mu1", + }, + XLM: { + ID: 148, + Handle: "stellar", + Symbol: "XLM", + Name: "Stellar", + Decimals: 7, + BlockTime: 5000, + MinConfirmations: 0, + SampleAddr: "GDKIJJIKXLOM2NRMPNQZUUYK24ZPVFC6426GZAEP3KUK6KEJLACCWNMX", + }, + POA: { + ID: 178, + Handle: "poa", + Symbol: "POA", + Name: "Poa", + Decimals: 18, + BlockTime: 30000, + MinConfirmations: 0, + SampleAddr: "0x1fddEc96688e0538A316C64dcFd211c491ECf0d8", + }, + TRX: { + ID: 195, + Handle: "tron", + Symbol: "TRX", + Name: "Tron", + Decimals: 6, + BlockTime: 10000, + MinConfirmations: 0, + SampleAddr: "TMuA6YqfCeX8EhbfYEg5y7S4DqzSJireY9", + }, + FIO: { + ID: 235, + Handle: "fio", + Symbol: "FIO", + Name: "FIO", + Decimals: 9, + BlockTime: 0, + MinConfirmations: 0, + SampleAddr: "FIO5J2xdfWygeNdHZNZRzRws8YGbVxjUXtp4eP8KoGkGKoLFQ7CaU", + }, + NIM: { + ID: 242, + Handle: "nimiq", + Symbol: "NIM", + Name: "Nimiq", + Decimals: 5, + BlockTime: 60000, + MinConfirmations: 0, + SampleAddr: "NQ86 2H8F YGU5 RM77 QSN9 LYLH C56A CYYR 0MLA", + }, + IOTX: { + ID: 304, + Handle: "iotex", + Symbol: "IOTX", + Name: "IoTeX", + Decimals: 18, + BlockTime: 10000, + MinConfirmations: 0, + SampleAddr: "io1mwekae7qqwlr23220k5n9z3fmjxz72tuchra3m", + }, + ZIL: { + ID: 313, + Handle: "zilliqa", + Symbol: "ZIL", + Name: "Zilliqa", + Decimals: 12, + BlockTime: 30000, + MinConfirmations: 1, + SampleAddr: "zil1anrjcsj2ntklaa3arq4w3s6gw4l4hqrycs9egy", + }, + AION: { + ID: 425, + Handle: "aion", + Symbol: "AION", + Name: "Aion", + Decimals: 18, + BlockTime: 10000, + MinConfirmations: 0, + SampleAddr: "0xa07981da70ce919e1db5f051c3c386eb526e6ce8b9e2bfd56e3f3d754b0a17f3", + }, + AE: { + ID: 457, + Handle: "aeternity", + Symbol: "AE", + Name: "Aeternity", + Decimals: 18, + BlockTime: 6000, + MinConfirmations: 0, + SampleAddr: "ak_2p5878zbFhxnrm7meL7TmqwtvBaqcBddyp5eGzZbovZ5FeVfcw", + }, + KAVA: { + ID: 459, + Handle: "kava", + Symbol: "KAVA", + Name: "Kava", + Decimals: 6, + BlockTime: 5000, + MinConfirmations: 0, + SampleAddr: "kava13fxkk4730cqglgdv7w0mdelyx07myyq7h2nd3x", + }, + THETA: { + ID: 500, + Handle: "theta", + Symbol: "THETA", + Name: "Theta", + Decimals: 18, + BlockTime: 0, + MinConfirmations: 0, + SampleAddr: "0xac0eeb6ee3e32e2c74e14ac74155063e4f4f981f", + }, + BNB: { + ID: 714, + Handle: "binance", + Symbol: "BNB", + Name: "BNB", + Decimals: 8, + BlockTime: 4000, + MinConfirmations: 2, + SampleAddr: "tbnb1fhr04azuhcj0dulm7ka40y0cqjlafwae9k9gk2", + }, + VET: { + ID: 818, + Handle: "vechain", + Symbol: "VET", + Name: "VeChain Token", + Decimals: 18, + BlockTime: 20000, + MinConfirmations: 0, + SampleAddr: "0xB5e883349e68aB59307d1604555AC890fAC47128", + }, + CLO: { + ID: 820, + Handle: "callisto", + Symbol: "CLO", + Name: "Callisto", + Decimals: 18, + BlockTime: 10000, + MinConfirmations: 0, + SampleAddr: "0x39ec1c88a7a7c1a575e8c8f42eff7630d9278179", + }, + TOMO: { + ID: 889, + Handle: "tomochain", + Symbol: "TOMO", + Name: "TOMO", + Decimals: 18, + BlockTime: 4000, + MinConfirmations: 0, + SampleAddr: "0x7daa83030e3086477b79b6e757ca8608899fe783", + }, + TT: { + ID: 1001, + Handle: "thundertoken", + Symbol: "TT", + Name: "ThunderCore", + Decimals: 18, + BlockTime: 10000, + MinConfirmations: 0, + SampleAddr: "0x0ad80a408eac4f17ba0a9de8a12d8736f60700c3", + }, + ONT: { + ID: 1024, + Handle: "ontology", + Symbol: "ONT", + Name: "Ontology", + Decimals: 0, + BlockTime: 10000, + MinConfirmations: 0, + SampleAddr: "AUyL4TZ1zFEcSKDJrjFnD7vsq5iFZMZqT7", + }, + XTZ: { + ID: 1729, + Handle: "tezos", + Symbol: "XTZ", + Name: "Tezos", + Decimals: 6, + BlockTime: 20000, + MinConfirmations: 0, + SampleAddr: "tz1WCd2jm4uSt4vntk4vSuUWoZQGhLcDuR9q", + }, + KIN: { + ID: 2017, + Handle: "kin", + Symbol: "KIN", + Name: "Kin", + Decimals: 5, + BlockTime: 5000, + MinConfirmations: 0, + SampleAddr: "GBHKUZ7C2SZ5N3X2S7O6TT6LNUWSEA2BXMSR5GTTSR6VZARSVAXIQNGH", + }, + NAS: { + ID: 2718, + Handle: "nebulas", + Symbol: "NAS", + Name: "Nebulas", + Decimals: 18, + BlockTime: 30000, + MinConfirmations: 0, + SampleAddr: "n1RCYwrpLMpSpUCQ8QUDzGRg6B2PnY8R94a", + }, + GO: { + ID: 6060, + Handle: "gochain", + Symbol: "GO", + Name: "GoChain GO", + Decimals: 18, + BlockTime: 20000, + MinConfirmations: 0, + SampleAddr: "0x76c2F81716A8D198a00502Ae9a59126418899FDe", + }, + WAN: { + ID: 5718350, + Handle: "wanchain", + Symbol: "WAN", + Name: "Wanchain", + Decimals: 18, + BlockTime: 30000, + MinConfirmations: 0, + SampleAddr: "0x36cEdc3A9d969306AF4F7CA2b83ABBf74095914d", + }, + WAVES: { + ID: 5741564, + Handle: "waves", + Symbol: "WAVES", + Name: "WAVES", + Decimals: 8, + BlockTime: 30000, + MinConfirmations: 1, + SampleAddr: "3P7wz6TXienpw3BHe8eHUEuZWb6WE58kgnQ", + }, + BTC: { + ID: 0, + Handle: "bitcoin", + Symbol: "BTC", + Name: "Bitcoin", + Decimals: 8, + BlockTime: 600000, + MinConfirmations: 0, + SampleAddr: "bc1quvuarfksewfeuevuc6tn0kfyptgjvwsvrprk9d", + }, + LTC: { + ID: 2, + Handle: "litecoin", + Symbol: "LTC", + Name: "Litecoin", + Decimals: 8, + BlockTime: 150000, + MinConfirmations: 0, + SampleAddr: "ltc1qhd8fxxp2dx3vsmpac43z6ev0kllm4n53t5sk0u", + }, + DOGE: { + ID: 3, + Handle: "doge", + Symbol: "DOGE", + Name: "Dogecoin", + Decimals: 8, + BlockTime: 60000, + MinConfirmations: 0, + SampleAddr: "DJRFZNg8jkUtjcpo2zJd92FUAzwRjitw6f", + }, + DASH: { + ID: 5, + Handle: "dash", + Symbol: "DASH", + Name: "Dash", + Decimals: 8, + BlockTime: 180000, + MinConfirmations: 0, + SampleAddr: "XqHiz8EXYbTAtBEYs4pWTHh7ipEDQcNQeT", + }, + VIA: { + ID: 14, + Handle: "viacoin", + Symbol: "VIA", + Name: "Viacoin", + Decimals: 8, + BlockTime: 15000, + MinConfirmations: 0, + SampleAddr: "via1qnmsgjd6cvfprnszdgmyg9kewtjfgqflz67wwhc", + }, + GRS: { + ID: 17, + Handle: "groestlcoin", + Symbol: "GRS", + Name: "Groestlcoin", + Decimals: 8, + BlockTime: 60000, + MinConfirmations: 0, + SampleAddr: "grs1qexwmshts5pdpeqglkl39zyl6693tmfwp0cue4j", + }, + ZEC: { + ID: 133, + Handle: "zcash", + Symbol: "ZEC", + Name: "Zcash", + Decimals: 8, + BlockTime: 150000, + MinConfirmations: 0, + SampleAddr: "t1YYnByMzdGhQv3W3rnjHMrJs6HH4Y231gy", + }, + XZC: { + ID: 136, + Handle: "zcoin", + Symbol: "XZC", + Name: "Zcoin", + Decimals: 8, + BlockTime: 300000, + MinConfirmations: 0, + SampleAddr: "aEd5XFChyXobvEics2ppAqgK3Bgusjxtik", + }, + BCH: { + ID: 145, + Handle: "bitcoincash", + Symbol: "BCH", + Name: "Bitcoin Cash", + Decimals: 8, + BlockTime: 600000, + MinConfirmations: 0, + SampleAddr: "bitcoincash:qq07l6rr5lsdm3m80qxw80ku2ex0tj76vvsxpvmgme", + }, + RVN: { + ID: 175, + Handle: "ravencoin", + Symbol: "RVN", + Name: "Raven", + Decimals: 8, + BlockTime: 60000, + MinConfirmations: 0, + SampleAddr: "RGkwvrUors8DtmhKy5bddFwRCTZaunjpvo", + }, + QTUM: { + ID: 2301, + Handle: "qtum", + Symbol: "QTUM", + Name: "Qtum", + Decimals: 8, + BlockTime: 60000, + MinConfirmations: 0, + SampleAddr: "QhceuaTdeCZtcxmVc6yyEDEJ7Riu5gWFoF", + }, + ZEL: { + ID: 19167, + Handle: "zelcash", + Symbol: "ZEL", + Name: "Zelcash", + Decimals: 8, + BlockTime: 120000, + MinConfirmations: 0, + SampleAddr: "t1UKbRPzL4WN8Rs8aZ8RNiWoD2ftCMHKGUf", + }, + DCR: { + ID: 42, + Handle: "decred", + Symbol: "DCR", + Name: "Decred", + Decimals: 8, + BlockTime: 300000, + MinConfirmations: 0, + SampleAddr: "DsTxPUVFxXeNgu5fzozr4mTR4tqqMaKcvpY", + }, + ALGO: { + ID: 283, + Handle: "algorand", + Symbol: "ALGO", + Name: "Algorand", + Decimals: 6, + BlockTime: 20000, + MinConfirmations: 0, + SampleAddr: "4EZFQABCVQTHQCK3HQBIYGC4NV2VM42FZHEFTVH77ROG4ZGREC6Y7V5T2U", + }, + NANO: { + ID: 165, + Handle: "nano", + Symbol: "NANO", + Name: "Nano", + Decimals: 30, + BlockTime: 0, + MinConfirmations: 0, + SampleAddr: "nano_1trqphog5noig7z888asnjejcie8z1iopxyepcjdo1atps8whxiuwd51ehbw", + }, + DGB: { + ID: 20, + Handle: "digibyte", + Symbol: "DGB", + Name: "DigiByte", + Decimals: 8, + BlockTime: 15000, + MinConfirmations: 0, + SampleAddr: "D8NBg12kfW8uLjzCv7LYnPYCNhqvVtHaMQ", + }, + ONE: { + ID: 1023, + Handle: "harmony", + Symbol: "ONE", + Name: "Harmony", + Decimals: 18, + BlockTime: 5000, + MinConfirmations: 0, + SampleAddr: "one1syjs6cnfwd9fgrhng03dyzs07suwtywwreczmk", + }, + KSM: { + ID: 434, + Handle: "kusama", + Symbol: "KSM", + Name: "Kusama", + Decimals: 12, + BlockTime: 6000, + MinConfirmations: 0, + SampleAddr: "HewiDTQv92L2bVtkziZC8ASxrFUxr6ajQ62RXAnwQ8FDVmg", + }, + DOT: { + ID: 354, + Handle: "polkadot", + Symbol: "DOT", + Name: "Polkadot", + Decimals: 10, + BlockTime: 6000, + MinConfirmations: 0, + SampleAddr: "13SkL2uACPqBzpKBh3d2n5msYNFB2QapA5vEDeKeLjG2LS3Y", + }, + SOL: { + ID: 501, + Handle: "solana", + Symbol: "SOL", + Name: "Solana", + Decimals: 9, + BlockTime: 500, + MinConfirmations: 0, + SampleAddr: "boot1Z6jb15CLqpaMTn2CxktktwZpRAVAgHZEW6SxQ7", + }, + NEAR: { + ID: 397, + Handle: "near", + Symbol: "NEAR", + Name: "NEAR", + Decimals: 18, + BlockTime: 2000, + MinConfirmations: 0, + SampleAddr: "NEAR6Y66fCzeKqWiwxoPox5oGeDN9VhNCu7CEQ9M86iniqoN9vg2X", + }, + ERD: { + ID: 508, + Handle: "elrond", + Symbol: "ERD", + Name: "Elrond", + Decimals: 18, + BlockTime: 6000, + MinConfirmations: 0, + SampleAddr: "erd12tqtt5zcg6vpw65y4hkanvt49kzq695sr3ctuszjy92xw0ppzcssy2xd5r", + }, + BSCLegacy: { + ID: 10000714, + Handle: "bsc", + Symbol: "BNB", + PreferedSymbol: "BSCLegacy", + Name: "Binance Smart Chain", + Decimals: 18, + BlockTime: 3000, + MinConfirmations: 0, + SampleAddr: "0x35552c16704d214347f29Fa77f77DA6d75d7C752", + }, + BSC: { + ID: 20000714, + Handle: "smartchain", + Symbol: "BNB", + PreferedSymbol: "BSC", + Name: "Binance Smart Chain", + Decimals: 18, + BlockTime: 3000, + MinConfirmations: 0, + SampleAddr: "0x35552c16704d214347f29Fa77f77DA6d75d7C752", + }, +} +func Ethereum() Coin { + return Coins[ETH] +} +func Classic() Coin { + return Coins[ETC] +} +func Icon() Coin { + return Coins[ICX] +} +func Cosmos() Coin { + return Coins[ATOM] +} +func Ripple() Coin { + return Coins[XRP] +} +func Stellar() Coin { + return Coins[XLM] +} +func Poa() Coin { + return Coins[POA] +} +func Tron() Coin { + return Coins[TRX] +} +func Fio() Coin { + return Coins[FIO] +} +func Nimiq() Coin { + return Coins[NIM] +} +func Iotex() Coin { + return Coins[IOTX] +} +func Zilliqa() Coin { + return Coins[ZIL] +} +func Aion() Coin { + return Coins[AION] +} +func Aeternity() Coin { + return Coins[AE] +} +func Kava() Coin { + return Coins[KAVA] +} +func Theta() Coin { + return Coins[THETA] +} +func Binance() Coin { + return Coins[BNB] +} +func Vechain() Coin { + return Coins[VET] +} +func Callisto() Coin { + return Coins[CLO] +} +func Tomochain() Coin { + return Coins[TOMO] +} +func Thundertoken() Coin { + return Coins[TT] +} +func Ontology() Coin { + return Coins[ONT] +} +func Tezos() Coin { + return Coins[XTZ] +} +func Kin() Coin { + return Coins[KIN] +} +func Nebulas() Coin { + return Coins[NAS] +} +func Gochain() Coin { + return Coins[GO] +} +func Wanchain() Coin { + return Coins[WAN] +} +func Waves() Coin { + return Coins[WAVES] +} +func Bitcoin() Coin { + return Coins[BTC] +} +func Litecoin() Coin { + return Coins[LTC] +} +func Doge() Coin { + return Coins[DOGE] +} +func Dash() Coin { + return Coins[DASH] +} +func Viacoin() Coin { + return Coins[VIA] +} +func Groestlcoin() Coin { + return Coins[GRS] +} +func Zcash() Coin { + return Coins[ZEC] +} +func Zcoin() Coin { + return Coins[XZC] +} +func Bitcoincash() Coin { + return Coins[BCH] +} +func Ravencoin() Coin { + return Coins[RVN] +} +func Qtum() Coin { + return Coins[QTUM] +} +func Zelcash() Coin { + return Coins[ZEL] +} +func Decred() Coin { + return Coins[DCR] +} +func Algorand() Coin { + return Coins[ALGO] +} +func Nano() Coin { + return Coins[NANO] +} +func Digibyte() Coin { + return Coins[DGB] +} +func Harmony() Coin { + return Coins[ONE] +} +func Kusama() Coin { + return Coins[KSM] +} +func Polkadot() Coin { + return Coins[DOT] +} +func Solana() Coin { + return Coins[SOL] +} +func Near() Coin { + return Coins[NEAR] +} +func Elrond() Coin { + return Coins[ERD] +} +func Bsc() Coin { + return Coins[BSCLegacy] +} +func Smartchain() Coin { + return Coins[BSC] +} + diff --git a/coin/coins.yml b/coin/coins.yml new file mode 100644 index 0000000..f8bc3c8 --- /dev/null +++ b/coin/coins.yml @@ -0,0 +1,416 @@ +- id: 60 + symbol: ETH + handle: ethereum + name: Ethereum + decimals: 18 + blockTime: 10000 + sampleAddress: '0xfc10cab6a50a1ab10c56983c80cc82afc6559cf1' + +- id: 61 + symbol: ETC + handle: classic + name: Ethereum Classic + decimals: 18 + blockTime: 30000 + sampleAddress: '0xf3524415b6D873205B4c3Cda783527b2aC4daAA9' + +- id: 74 + symbol: ICX + handle: icon + name: ICON + decimals: 18 + sampleAddress: 'hxee691e7bccc4eb11fee922896e9f51490e62b12e' + +- id: 118 + symbol: ATOM + handle: cosmos + name: Cosmos + decimals: 6 + blockTime: 5000 + sampleAddress: 'cosmos1rw62phusuv9vzraezr55k0vsqssvz6ed52zyrl' + +- id: 144 + symbol: XRP + handle: ripple + name: Ripple + decimals: 6 + blockTime: 5000 + sampleAddress: 'rMQ98K56yXJbDGv49ZSmW51sLn94Xe1mu1' + +- id: 148 + symbol: XLM + handle: stellar + name: Stellar + decimals: 7 + blockTime: 5000 + sampleAddress: 'GDKIJJIKXLOM2NRMPNQZUUYK24ZPVFC6426GZAEP3KUK6KEJLACCWNMX' + +- id: 178 + symbol: POA + handle: poa + name: Poa + decimals: 18 + blockTime: 30000 + sampleAddress: '0x1fddEc96688e0538A316C64dcFd211c491ECf0d8' + +- id: 195 + symbol: TRX + handle: tron + name: Tron + decimals: 6 + blockTime: 10000 + sampleAddress: 'TMuA6YqfCeX8EhbfYEg5y7S4DqzSJireY9' + +- id: 235 + symbol: FIO + handle: fio + name: FIO + decimals: 9 + sampleAddress: 'FIO5J2xdfWygeNdHZNZRzRws8YGbVxjUXtp4eP8KoGkGKoLFQ7CaU' + +- id: 242 + symbol: NIM + handle: nimiq + name: Nimiq + decimals: 5 + blockTime: 60000 + sampleAddress: 'NQ86 2H8F YGU5 RM77 QSN9 LYLH C56A CYYR 0MLA' + +- id: 304 + symbol: IOTX + handle: iotex + name: IoTeX + decimals: 18 + blockTime: 10000 + sampleAddress: 'io1mwekae7qqwlr23220k5n9z3fmjxz72tuchra3m' + +- id: 313 + symbol: ZIL + handle: zilliqa + name: Zilliqa + decimals: 12 + blockTime: 30000 + minConfirmations: 1 + sampleAddress: 'zil1anrjcsj2ntklaa3arq4w3s6gw4l4hqrycs9egy' + +- id: 425 + symbol: AION + handle: aion + name: Aion + decimals: 18 + blockTime: 10000 + sampleAddress: '0xa07981da70ce919e1db5f051c3c386eb526e6ce8b9e2bfd56e3f3d754b0a17f3' + +- id: 457 + symbol: AE + handle: aeternity + name: Aeternity + decimals: 18 + blockTime: 6000 + sampleAddress: 'ak_2p5878zbFhxnrm7meL7TmqwtvBaqcBddyp5eGzZbovZ5FeVfcw' + +- id: 459 + symbol: KAVA + handle: kava + name: Kava + decimals: 6 + blockTime: 5000 + sampleAddress: 'kava13fxkk4730cqglgdv7w0mdelyx07myyq7h2nd3x' + +- id: 500 + symbol: THETA + handle: theta + name: Theta + decimals: 18 + sampleAddress: '0xac0eeb6ee3e32e2c74e14ac74155063e4f4f981f' + +- id: 714 + symbol: BNB + handle: binance + name: BNB + decimals: 8 + blockTime: 4000 + minConfirmations: 2 + sampleAddress: 'tbnb1fhr04azuhcj0dulm7ka40y0cqjlafwae9k9gk2' + +- id: 818 + symbol: VET + handle: vechain + name: VeChain Token + decimals: 18 + blockTime: 20000 + sampleAddress: '0xB5e883349e68aB59307d1604555AC890fAC47128' + +- id: 820 + symbol: CLO + handle: callisto + name: Callisto + decimals: 18 + blockTime: 10000 + sampleAddress: '0x39ec1c88a7a7c1a575e8c8f42eff7630d9278179' + +- id: 889 + symbol: TOMO + handle: tomochain + name: TOMO + blockTime: 4000 + decimals: 18 + sampleAddress: '0x7daa83030e3086477b79b6e757ca8608899fe783' + +- id: 1001 + symbol: TT + handle: thundertoken + name: ThunderCore + decimals: 18 + blockTime: 10000 + sampleAddress: '0x0ad80a408eac4f17ba0a9de8a12d8736f60700c3' + +- id: 1024 + symbol: ONT + handle: ontology + name: Ontology + decimals: 0 + blockTime: 10000 + sampleAddress: 'AUyL4TZ1zFEcSKDJrjFnD7vsq5iFZMZqT7' + +- id: 1729 + symbol: XTZ + handle: tezos + name: Tezos + decimals: 6 + blockTime: 20000 + sampleAddress: 'tz1WCd2jm4uSt4vntk4vSuUWoZQGhLcDuR9q' + +- id: 2017 + symbol: KIN + handle: kin + name: Kin + decimals: 5 + blockTime: 5000 + sampleAddress: 'GBHKUZ7C2SZ5N3X2S7O6TT6LNUWSEA2BXMSR5GTTSR6VZARSVAXIQNGH' + +- id: 2718 + symbol: NAS + handle: nebulas + name: Nebulas + decimals: 18 + blockTime: 30000 + sampleAddress: 'n1RCYwrpLMpSpUCQ8QUDzGRg6B2PnY8R94a' + +- id: 6060 + symbol: GO + handle: gochain + name: GoChain GO + decimals: 18 + blockTime: 20000 + sampleAddress: '0x76c2F81716A8D198a00502Ae9a59126418899FDe' + +- id: 5718350 + symbol: WAN + handle: wanchain + name: Wanchain + decimals: 18 + blockTime: 30000 + sampleAddress: '0x36cEdc3A9d969306AF4F7CA2b83ABBf74095914d' + +- id: 5741564 + symbol: WAVES + handle: waves + name: WAVES + decimals: 8 + blockTime: 30000 + minConfirmations: 1 + sampleAddress: '3P7wz6TXienpw3BHe8eHUEuZWb6WE58kgnQ' + +- id: 0 + symbol: BTC + handle: bitcoin + name: Bitcoin + decimals: 8 + blockTime: 600000 + sampleAddress: 'bc1quvuarfksewfeuevuc6tn0kfyptgjvwsvrprk9d' + +- id: 2 + symbol: LTC + handle: litecoin + name: Litecoin + decimals: 8 + blockTime: 150000 + sampleAddress: 'ltc1qhd8fxxp2dx3vsmpac43z6ev0kllm4n53t5sk0u' + +- id: 3 + symbol: DOGE + handle: doge + name: Dogecoin + decimals: 8 + blockTime: 60000 + sampleAddress: 'DJRFZNg8jkUtjcpo2zJd92FUAzwRjitw6f' + +- id: 5 + symbol: DASH + handle: dash + name: Dash + decimals: 8 + blockTime: 180000 + sampleAddress: 'XqHiz8EXYbTAtBEYs4pWTHh7ipEDQcNQeT' + +- id: 14 + symbol: VIA + handle: viacoin + name: Viacoin + decimals: 8 + blockTime: 15000 + sampleAddress: 'via1qnmsgjd6cvfprnszdgmyg9kewtjfgqflz67wwhc' + +- id: 17 + symbol: GRS + handle: groestlcoin + name: Groestlcoin + decimals: 8 + blockTime: 60000 + sampleAddress: 'grs1qexwmshts5pdpeqglkl39zyl6693tmfwp0cue4j' + +- id: 133 + symbol: ZEC + handle: zcash + name: Zcash + decimals: 8 + blockTime: 150000 + sampleAddress: 't1YYnByMzdGhQv3W3rnjHMrJs6HH4Y231gy' + +- id: 136 + symbol: XZC + handle: zcoin + name: Zcoin + decimals: 8 + blockTime: 300000 + sampleAddress: 'aEd5XFChyXobvEics2ppAqgK3Bgusjxtik' + +- id: 145 + symbol: BCH + handle: bitcoincash + name: Bitcoin Cash + decimals: 8 + blockTime: 600000 + sampleAddress: 'bitcoincash:qq07l6rr5lsdm3m80qxw80ku2ex0tj76vvsxpvmgme' + +- id: 175 + symbol: RVN + handle: ravencoin + name: Raven + decimals: 8 + blockTime: 60000 + sampleAddress: 'RGkwvrUors8DtmhKy5bddFwRCTZaunjpvo' + +- id: 2301 + symbol: QTUM + handle: qtum + name: Qtum + decimals: 8 + blockTime: 60000 + sampleAddress: 'QhceuaTdeCZtcxmVc6yyEDEJ7Riu5gWFoF' + +- id: 19167 + symbol: ZEL + handle: zelcash + name: Zelcash + decimals: 8 + blockTime: 120000 + sampleAddress: 't1UKbRPzL4WN8Rs8aZ8RNiWoD2ftCMHKGUf' + +- id: 42 + symbol: DCR + handle: decred + name: Decred + decimals: 8 + blockTime: 300000 + sampleAddress: 'DsTxPUVFxXeNgu5fzozr4mTR4tqqMaKcvpY' + +- id: 283 + symbol: ALGO + handle: algorand + name: Algorand + decimals: 6 + blockTime: 20000 + sampleAddress: '4EZFQABCVQTHQCK3HQBIYGC4NV2VM42FZHEFTVH77ROG4ZGREC6Y7V5T2U' + +- id: 165 + symbol: NANO + handle: nano + name: Nano + decimals: 30 + sampleAddress: 'nano_1trqphog5noig7z888asnjejcie8z1iopxyepcjdo1atps8whxiuwd51ehbw' + +- id: 20 + symbol: DGB + handle: digibyte + name: DigiByte + decimals: 8 + blockTime: 15000 + sampleAddress: 'D8NBg12kfW8uLjzCv7LYnPYCNhqvVtHaMQ' + +- id: 1023 + symbol: ONE + handle: harmony + name: Harmony + decimals: 18 + blockTime: 5000 + sampleAddress: 'one1syjs6cnfwd9fgrhng03dyzs07suwtywwreczmk' + +- id: 434 + symbol: KSM + handle: kusama + name: Kusama + decimals: 12 + blockTime: 6000 + sampleAddress: 'HewiDTQv92L2bVtkziZC8ASxrFUxr6ajQ62RXAnwQ8FDVmg' + +- id: 354 + symbol: DOT + handle: polkadot + name: Polkadot + decimals: 10 + blockTime: 6000 + sampleAddress: '13SkL2uACPqBzpKBh3d2n5msYNFB2QapA5vEDeKeLjG2LS3Y' + +- id: 501 + symbol: SOL + handle: solana + name: Solana + decimals: 9 + blockTime: 500 + sampleAddress: 'boot1Z6jb15CLqpaMTn2CxktktwZpRAVAgHZEW6SxQ7' + +- id: 397 + symbol: NEAR + handle: near + name: NEAR + decimals: 18 + blockTime: 2000 + sampleAddress: 'NEAR6Y66fCzeKqWiwxoPox5oGeDN9VhNCu7CEQ9M86iniqoN9vg2X' + +- id: 508 + symbol: ERD + handle: elrond + name: Elrond + decimals: 18 + blockTime: 6000 + sampleAddress: 'erd12tqtt5zcg6vpw65y4hkanvt49kzq695sr3ctuszjy92xw0ppzcssy2xd5r' + +- id: 10000714 + symbol: BNB + preferedSymbol: BSCLegacy + handle: bsc + name: 'Binance Smart Chain' + decimals: 18 + blockTime: 3000 + sampleAddress: '0x35552c16704d214347f29Fa77f77DA6d75d7C752' + +- id: 20000714 + symbol: BNB + preferedSymbol: BSC + handle: smartchain + name: 'Binance Smart Chain' + decimals: 18 + blockTime: 3000 + sampleAddress: '0x35552c16704d214347f29Fa77f77DA6d75d7C752' diff --git a/coin/gen.go b/coin/gen.go new file mode 100644 index 0000000..a99e7b7 --- /dev/null +++ b/coin/gen.go @@ -0,0 +1,140 @@ +// +build coins + +package main + +import ( + "html/template" + "log" + "os" + "strings" + "time" + + "gopkg.in/yaml.v2" +) + +const ( + coinFile = "coin/coins.yml" + filename = "coin/coins.go" + templateFile = `// Code generated by go generate; DO NOT EDIT. +// This file was generated by robots at +// {{ .Timestamp }} +// using data from coins.yml +package coin + +import ( + "fmt" +) + +// Coin is the native currency of a blockchain +type Coin struct { + ID uint + Handle string + Symbol string + PreferedSymbol string + Name string + Decimals uint + BlockTime int + MinConfirmations int64 + SampleAddr string +} + +func (c *Coin) String() string { + return fmt.Sprintf("[%s] %s (#%d)", c.Symbol, c.Name, c.ID) +} + +const ( +{{- range .Coins }} +{{- if .PreferedSymbol}} + {{ .PreferedSymbol }} = {{ .ID }} +{{- else}} + {{ .Symbol }} = {{ .ID }} +{{- end}} +{{- end }} +) + +var Coins = map[uint]Coin{ +{{- range .Coins }} +{{- if .PreferedSymbol }} + {{ .PreferedSymbol }}: { +{{- else }} + {{ .Symbol }}: { +{{- end }} + ID: {{.ID}}, + Handle: "{{.Handle}}", + Symbol: "{{.Symbol}}", +{{- if .PreferedSymbol }} + PreferedSymbol: "{{.PreferedSymbol}}", +{{- end }} + Name: "{{.Name}}", + Decimals: {{.Decimals}}, + BlockTime: {{.BlockTime}}, + MinConfirmations: {{.MinConfirmations}}, + SampleAddr: "{{.SampleAddr}}", + }, +{{- end }} +} + +{{- range .Coins }} +func {{ .Handle.Capitalize }}() Coin { +{{- if .PreferedSymbol }} + return Coins[{{ .PreferedSymbol }}] +{{- else }} + return Coins[{{ .Symbol }}] +{{- end}} +} + +{{- end }} + +` +) + +type Handle string + +func (h Handle) Capitalize() string { + return strings.Title(string(h)) +} + +type Coin struct { + ID uint `yaml:"id"` + Handle Handle `yaml:"handle"` + Symbol string `yaml:"symbol"` + PreferedSymbol string `yaml:"preferedSymbol,omitempty"` + Name string `yaml:"name"` + Decimals uint `yaml:"decimals"` + BlockTime int `yaml:"blockTime"` + MinConfirmations int64 `yaml:"minConfirmations"` + SampleAddr string `yaml:"sampleAddress"` +} + +func main() { + var coinList []Coin + coin, err := os.Open(coinFile) + dec := yaml.NewDecoder(coin) + err = dec.Decode(&coinList) + if err != nil { + log.Panic(err) + } + + f, err := os.Create(filename) + if err != nil { + log.Panic(err) + } + defer f.Close() + + coinsTemplate := template.Must(template.New("").Parse(templateFile)) + err = coinsTemplate.Execute(f, map[string]interface{}{ + "Timestamp": time.Now(), + "Coins": coinList, + }) + if err != nil { + log.Panic(err) + } +} + +func getValidParameter(env, variable string) string { + e, ok := os.LookupEnv(env) + if ok { + return e + } + return variable +} diff --git a/coin/gen_test.go b/coin/gen_test.go new file mode 100644 index 0000000..e4229ae --- /dev/null +++ b/coin/gen_test.go @@ -0,0 +1,96 @@ +package coin + +import ( + "fmt" + "io/ioutil" + "os" + "strings" + "testing" + + "github.com/stretchr/testify/assert" + "gopkg.in/yaml.v2" +) + +const ( + coinFile = "coins.yml" + filename = "coins.go" +) + +type TestCoin struct { + ID uint `yaml:"id"` + Handle string `yaml:"handle"` + Symbol string `yaml:"symbol"` + PreferedSymbol string `yaml:"preferedSymbol,omitempty"` + Name string `yaml:"name"` + Decimals uint `yaml:"decimals"` + BlockTime int `yaml:"blockTime"` + MinConfirmations int64 `yaml:"minConfirmations"` + SampleAddr string `yaml:"sampleAddress"` +} + +func TestFilesExists(t *testing.T) { + assert.True(t, assert.FileExists(t, coinFile)) + assert.True(t, assert.FileExists(t, filename)) +} + +func TestCoinFile(t *testing.T) { + var coinList []TestCoin + coin, err := os.Open(coinFile) + if err != nil { + t.Error(err) + } + dec := yaml.NewDecoder(coin) + err = dec.Decode(&coinList) + if err != nil { + t.Error(err) + } + + f, err := os.Open(filename) + if err != nil { + t.Error(err) + } + defer f.Close() + b, err := ioutil.ReadAll(f) + if err != nil { + t.Error(err) + } + code := string(b) + + for _, want := range coinList { + got, ok := Coins[want.ID] + assert.True(t, ok) + assert.Equal(t, got.ID, want.ID) + assert.Equal(t, got.Handle, want.Handle) + assert.Equal(t, got.Symbol, want.Symbol) + assert.Equal(t, got.Name, want.Name) + assert.Equal(t, got.Decimals, want.Decimals) + assert.Equal(t, got.BlockTime, want.BlockTime) + assert.Equal(t, got.MinConfirmations, want.MinConfirmations) + assert.Equal(t, got.SampleAddr, want.SampleAddr) + + s := strings.Title(want.Handle) + method := fmt.Sprintf("func %s() Coin", s) + assert.True(t, strings.Contains(code, method), "Coin method not found") + var enum string + if want.PreferedSymbol != "" { + enum = fmt.Sprintf("%s = %d", want.PreferedSymbol, want.ID) + } else { + enum = fmt.Sprintf("%s = %d", want.Symbol, want.ID) + } + assert.True(t, strings.Contains(code, enum), "Coin enum not found") + + } +} + +func TestEthereum(t *testing.T) { + + c := Ethereum() + + assert.Equal(t, uint(60), c.ID) + assert.Equal(t, "ethereum", c.Handle) + assert.Equal(t, "ETH", c.Symbol) + assert.Equal(t, "Ethereum", c.Name) + assert.Equal(t, uint(18), c.Decimals) + assert.Equal(t, 10000, c.BlockTime) + assert.Equal(t, int64(0), c.MinConfirmations) +} diff --git a/coin/models.go b/coin/models.go new file mode 100644 index 0000000..06429cf --- /dev/null +++ b/coin/models.go @@ -0,0 +1,17 @@ +package coin + +type ExternalCoin struct { + Coin uint `json:"coin"` + Symbol string `json:"symbol"` + Name string `json:"name"` + Decimals uint `json:"decimals"` +} + +func (c *Coin) External() *ExternalCoin { + return &ExternalCoin{ + Coin: c.ID, + Name: c.Name, + Symbol: c.Symbol, + Decimals: c.Decimals, + } +}