Casey Gardiner
d25b6c6ee2
Mainnet Release Candidate 2023.1.2 ( #4376 )
...
* remove default timeouts
* store the evm call timeout in rosetta object
* [cmd] actually apply ToRPCServerConfig
* Removed unused method.
* Rotate external leaders on non-beacon chains.
* Fix nil panic.
* Bump github.com/aws/aws-sdk-go from 1.33.0 to 1.34.0
Bumps [github.com/aws/aws-sdk-go](https://github.com/aws/aws-sdk-go ) from 1.33.0 to 1.34.0.
- [Release notes](https://github.com/aws/aws-sdk-go/releases )
- [Changelog](https://github.com/aws/aws-sdk-go/blob/v1.34.0/CHANGELOG.md )
- [Commits](https://github.com/aws/aws-sdk-go/compare/v1.33.0...v1.34.0 )
---
updated-dependencies:
- dependency-name: github.com/aws/aws-sdk-go
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
* Bump github.com/ipld/go-ipld-prime from 0.9.0 to 0.19.0
Bumps [github.com/ipld/go-ipld-prime](https://github.com/ipld/go-ipld-prime ) from 0.9.0 to 0.19.0.
- [Release notes](https://github.com/ipld/go-ipld-prime/releases )
- [Changelog](https://github.com/ipld/go-ipld-prime/blob/master/CHANGELOG.md )
- [Commits](https://github.com/ipld/go-ipld-prime/compare/v0.9.0...v0.19.0 )
---
updated-dependencies:
- dependency-name: github.com/ipld/go-ipld-prime
dependency-type: indirect
...
Signed-off-by: dependabot[bot] <support@github.com>
* Bump golang.org/x/net from 0.3.0 to 0.7.0
Bumps [golang.org/x/net](https://github.com/golang/net ) from 0.3.0 to 0.7.0.
- [Release notes](https://github.com/golang/net/releases )
- [Commits](https://github.com/golang/net/compare/v0.3.0...v0.7.0 )
---
updated-dependencies:
- dependency-name: golang.org/x/net
dependency-type: indirect
...
Signed-off-by: dependabot[bot] <support@github.com>
* Small fixes.
* in progress.
* in progress.
* in progress.
* consensus check is forked
* update master
* fix leader
* check leader for N blocks
* fix
* fix
* Cleanup and fix update pub keys.
* Rotate leader.
* fix
fix
fix
fix
fix
* Cleaned.
* Cache for `GetLeaderPubKeyFromCoinbase`, removed `NthNextHmyExt`.
* activate epoch
* comment activation
* 295 epoch
* Fix failed tests.
* Fixed code review.
* Fix review "--port flag".
* Fix review comments.
* Returned locks in rotateLeader.
* Rebased onto dev.
* Commented golangci.
* staged stream sync v1.0
* fix protocol tests
* fix spell
* remove unused struct
* fix rosetta test
* add comments and refactor verify sig
* add comments, remove extra function
* add comment
* refactor errors, rename metrics
* refactor p2p host creation
* fix initsync and host creation
* fix short range hash chain
* fix beacon node detection for p2p protocol
* refactor stream peer cooldown and fix protocol beacon node field
* refactor p2p host and routing
* fix p2p discovery test issue
* add MaxAdvertiseWaitTime to handle advertisements interval and address stream connection issue
* terminal print the peer id and proto id
* fix boot complete message when node is shut down
* add new config option ( ForceReachabilityPublic ) to fix local-net consensus issue
* fix self query issue
* fix test NewDNSSyncingPeerProvider
* [testnet] disable leader rotation
* fix discovery issue for legacy sync
* add watermark low/high options for p2p connection manager
* add test for new conn manager flags
* fix dedent
* add comment to inform about p2p connection manager options
* fix max height issue
* add a separate log for get max height error
* fix log
* feat: triesInMemory flag
* fix: panic if TriesInMemory is 1 to 2
* in progress.
* consensus check is forked
* fix
* Cleanup and fix update pub keys.
* fix
fix
fix
fix
fix
* activate epoch
* EpochTBD for leader rotation epoch.
* 295 epoch
* Decider no longer requires public keys as a dependency. (#4289 )
* Consensus doesn't require anymore `Node` as a circular dependency.
* Proper blockchain initialization.
* Rwlock consensus.
* Removed channels.
* Removed view change locks.
* Removed timers locks.
* Removed fbft locks.
* Removed multiSigMutex locks.
* Removed leader locks.
* Removed additional locks and isViewChange.
* Added locks detected by race.
* Added locks detected by race.
* Locks for start.
* Removed additional logs.
* Removed additional locks.
* Removed additional locks.
* Make func private.
* Make VerifyBlock private.
* Make IsLeader private.
* Make ParseFBFTMessage private.
* Fix remove locks.
* Added additional locks.
* Added additional locks.
* Added readSignatureBitmapPayload locks.
* Added HandleMessageUpdate locks.
* Added LastMile locks.
* Locks for IsValidatorInCommittee.
* Fixed locks.
* Fixed tests.
* Fixed tests.
* Fixed lock.
* Rebased over leader rotation.
* Fix formatting.
* Rebased onto dev.
* in progress.
* consensus check is forked
* update master
* fix leader
* check leader for N blocks
* fix
* fix
* Cleanup and fix update pub keys.
* Rotate leader.
* fix
fix
fix
fix
fix
* Cleaned.
* Cache for `GetLeaderPubKeyFromCoinbase`, removed `NthNextHmyExt`.
* comment activation
* 295 epoch
* Fix failed tests.
* Fixed code review.
* Fix review comments.
* Merged leader rotation.
* Rebased on dev.
* Rebased on dev.
* Fix usage of private methods.
* Fix usage of private methods.
* Fix usage of private methods.
* Removed deadcode, LockedFBFTPhase.
* Fix review comment.
* Fix review comment.
* Go mod tidy.
* Set to EpochTBD.
* Fix tests.
* [core] fix state handling of self destruct
If a contract self destructs to self and then receives funds within the
same transaction, it is possible for its stale state to be saved. This
change removes that possibility by checking for deleted state objects
before returning them.
* Fixed race error.
* rpc: add configurable http and `eth_call` timeout
* remove default timeouts
* store the evm call timeout in rosetta object
* [cmd] actually apply ToRPCServerConfig
* Removed unused method.
* Rotate external leaders on non-beacon chains.
* Fix nil panic.
* in progress.
* in progress.
* in progress.
* consensus check is forked
* update master
* fix leader
* check leader for N blocks
* fix
* fix
* Cleanup and fix update pub keys.
* Rotate leader.
* fix
fix
fix
fix
fix
* Cleaned.
* Cache for `GetLeaderPubKeyFromCoinbase`, removed `NthNextHmyExt`.
* Fixed code review.
* Fix review comments.
* Returned locks in rotateLeader.
* Rebased onto dev.
* staged stream sync v1.0
* refactor errors, rename metrics
* fix p2p discovery test issue
* add watermark low/high options for p2p connection manager
* fix dedent
* in progress.
* consensus check is forked
* fix
* Cleanup and fix update pub keys.
* fix
fix
fix
fix
fix
* activate epoch
* EpochTBD for leader rotation epoch.
* 295 epoch
* Decider no longer requires public keys as a dependency. (#4289 )
* Consensus doesn't require anymore `Node` as a circular dependency.
* Proper blockchain initialization.
* Rwlock consensus.
* Removed channels.
* Removed view change locks.
* Removed multiSigMutex locks.
* Removed leader locks.
* Removed additional locks and isViewChange.
* Added locks detected by race.
* Added locks detected by race.
* Locks for start.
* Removed additional locks.
* Removed additional locks.
* Make func private.
* Make VerifyBlock private.
* Make IsLeader private.
* Make ParseFBFTMessage private.
* Fix remove locks.
* Added additional locks.
* Added additional locks.
* Added readSignatureBitmapPayload locks.
* Added HandleMessageUpdate locks.
* Added LastMile locks.
* Locks for IsValidatorInCommittee.
* Fixed locks.
* Fixed tests.
* Fixed lock.
* Rebased over leader rotation.
* in progress.
* consensus check is forked
* update master
* fix leader
* check leader for N blocks
* fix
* fix
* Cleanup and fix update pub keys.
* Rotate leader.
* fix
fix
fix
fix
fix
* Cleaned.
* Cache for `GetLeaderPubKeyFromCoinbase`, removed `NthNextHmyExt`.
* Fix failed tests.
* Fixed code review.
* Fix review comments.
* Merged leader rotation.
* Rebased on dev.
* Rebased on dev.
* Fix usage of private methods.
* Fix usage of private methods.
* Fix usage of private methods.
* Removed deadcode, LockedFBFTPhase.
* Fix review comment.
* Go mod tidy.
* remove default timeouts
* Rotate external leaders on non-beacon chains.
* Fix nil panic.
* Fixes.
* Update singleton.go
* evm: don't return extcode for validators
Due to technical debt, validator information is stored in the code field
of the address. The code field can be accessed in Solidity for an
arbitrary address using `extcodesize`, `extcodehash`, and `extcodecopy`
or helper commands (such as `address.code.Length`). The presence of this
field is used by contract developers to (erroneously) deny smart
contract access to other smart contracts (and therefore, validators).
This PR fixes that oversight by returning the same values as other EOAs
for known validator addresses. Obviously, it needs a hard fork that will
be scheduled separately.
* Fix context passing.
* Clean up code.
* Removed engine dependency.
* Fix possible panic.
* Clean up code.
* Network type.
* Fix tests.
* Revert "Removed engine dependency." (#4392 )
* Revert "Fix tests."
This reverts commit 597ba2d6f1
.
* Revert "Network type."
This reverts commit 5e1878aedc
.
* Revert "Clean up code."
This reverts commit 15885f4c9b
.
* Revert "Fix possible panic."
This reverts commit 1a70d5eb66
.
* Revert "Removed engine dependency."
This reverts commit 8c2ff803f7
.
* gitignore the cache folder (#4389 )
* stable localnet with external validator (#4388 )
* stable localnet with external validator
* ignore deploy config file comments
* reduce node launched in localnet
* update makefile
* localnet configuration - add more fn
* fix validator information command typo
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: MaxMustermann2 <82761650+MaxMustermann2@users.noreply.github.com>
Co-authored-by: frozen <355847+Frozen@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: “GheisMohammadi” <“Gheis.Mohammadi@gmail.com”>
Co-authored-by: “GheisMohammadi” <36589218+GheisMohammadi@users.noreply.github.com>
Co-authored-by: Sun Hyuk Ahn <sunhyukahn@Suns-MacBook-Pro.local>
Co-authored-by: Soph <35721420+sophoah@users.noreply.github.com>
2 years ago
Casey Gardiner
7ab8be3377
Release Candidate: dev -> main ( #4319 )
...
* Rebase dev branch to current main branch (#4318 )
* add openssl compatibility on m2 chips using darwin (#4302 )
Adds support for OpenSSL on MacOS Ventura using m2 chips.
* [dumpdb] ensure each cross link is dumped (#4311 )
* bump libp2p to version 0.24.0 and update its dependencies and relevant tests (#4315 )
* Removed legacy syncing peer provider. (#4260 )
* Removed legacy syncing peer provider.
* Fix localnet.
* Fix migrate version.
* Rebased on main.
* Fix formatting.
* Remove blockchain dependency from engine. (#4310 )
* Consensus doesn't require anymore `Node` as a circular dependency.
* Rebased upon main.
* Removed engine beacon chain dependency.
* Fixed nil error.
* Fixed error.
* bump libp2p to version 0.24.0 and update its dependencies and relevant tests
* fix format, remove wrongly added configs
* add back wrongly deleted comment
* fix travis go checker
Co-authored-by: Konstantin <355847+Frozen@users.noreply.github.com>
Co-authored-by: “GheisMohammadi” <“Gheis.Mohammadi@gmail.com”>
* bump libp2p to version 0.24.0 and update its dependencies and relevant tests (#4315 )
* Removed legacy syncing peer provider. (#4260 )
* Removed legacy syncing peer provider.
* Fix localnet.
* Fix migrate version.
* Rebased on main.
* Fix formatting.
* Remove blockchain dependency from engine. (#4310 )
* Consensus doesn't require anymore `Node` as a circular dependency.
* Rebased upon main.
* Removed engine beacon chain dependency.
* Fixed nil error.
* Fixed error.
* bump libp2p to version 0.24.0 and update its dependencies and relevant tests
* fix format, remove wrongly added configs
* add back wrongly deleted comment
* fix travis go checker
Co-authored-by: Konstantin <355847+Frozen@users.noreply.github.com>
Co-authored-by: “GheisMohammadi” <“Gheis.Mohammadi@gmail.com”>
* Fix for consensus stuck. (#4307 )
* Added check for block validity.
* Starts new view change if block invalid.
* Revert "Starts new view change if block invalid."
This reverts commit e889fa5da2e0780f087ab7dae5106b96287706db.
* staged dns sync v1.0 (#4316 )
* staged dns sync v1.0
* enabled stream downloader for localnet
* fix code review issues
* remove extra lock
Co-authored-by: “GheisMohammadi” <“Gheis.Mohammadi@gmail.com”>
* add description for closing client and change randomize process to ma… (#4276 )
* add description for closing client and change randomize process to make sure only online nodes are added to sync config
* fix sync test
* fix legacy limitNumPeers test
* add WaitForEachPeerToConnect to node configs to make parallel peer connection optional
Co-authored-by: “GheisMohammadi” <“Gheis.Mohammadi@gmail.com”>
* Small fixes and code cleanup for network stack. (#4320 )
* staged dns sync v1.0
* enabled stream downloader for localnet
* fix code review issues
* remove extra lock
* staged dns sync v1.0
* Fixed, code clean up and other.
* Fixed, code clean up and other.
* Fixed, code clean up and other.
* Fix config.
Co-authored-by: “GheisMohammadi” <“Gheis.Mohammadi@gmail.com”>
* Fix not disable cache in archival mode (#4322 )
* Feature registry (#4324 )
* Registry for services.
* Test.
* Reverted comment.
* Fix.
* Slash fix (#4284 )
* Implementation of new slashing rate calculation
* Write tests for then new slashing rate calculation
* Add engine.applySlashing tests
* fix #4059
Co-authored-by: Alex Brezas <abresas@gmail.com>
Co-authored-by: Dimitris Lamprinos <pkakelas@gmail.com>
* Bump github.com/aws/aws-sdk-go from 1.30.1 to 1.33.0 (#4325 ) (#4328 )
Bumps [github.com/aws/aws-sdk-go](https://github.com/aws/aws-sdk-go ) from 1.30.1 to 1.33.0.
- [Release notes](https://github.com/aws/aws-sdk-go/releases )
- [Changelog](https://github.com/aws/aws-sdk-go/blob/v1.33.0/CHANGELOG.md )
- [Commits](https://github.com/aws/aws-sdk-go/compare/v1.30.1...v1.33.0 )
---
updated-dependencies:
- dependency-name: github.com/aws/aws-sdk-go
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Bump github.com/btcsuite/btcd from 0.21.0-beta to 0.23.2 (#4327 ) (#4329 )
Bumps [github.com/btcsuite/btcd](https://github.com/btcsuite/btcd ) from 0.21.0-beta to 0.23.2.
- [Release notes](https://github.com/btcsuite/btcd/releases )
- [Changelog](https://github.com/btcsuite/btcd/blob/master/CHANGES )
- [Commits](https://github.com/btcsuite/btcd/compare/v0.21.0-beta...v0.23.2 )
---
updated-dependencies:
- dependency-name: github.com/btcsuite/btcd
dependency-type: indirect
...
Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Max <82761650+MaxMustermann2@users.noreply.github.com>
Co-authored-by: Gheis <36589218+GheisMohammadi@users.noreply.github.com>
Co-authored-by: Konstantin <355847+Frozen@users.noreply.github.com>
Co-authored-by: “GheisMohammadi” <“Gheis.Mohammadi@gmail.com”>
Co-authored-by: Danny Willis <102543677+dannyposi@users.noreply.github.com>
Co-authored-by: PeekPI <894646171@QQ.COM>
Co-authored-by: Alex Brezas <abresas@gmail.com>
Co-authored-by: Dimitris Lamprinos <pkakelas@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2 years ago
Gheis
8d3be78cc7
bump libp2p to version 0.24.0 and update its dependencies and relevant tests ( #4315 )
...
* Removed legacy syncing peer provider. (#4260 )
* Removed legacy syncing peer provider.
* Fix localnet.
* Fix migrate version.
* Rebased on main.
* Fix formatting.
* Remove blockchain dependency from engine. (#4310 )
* Consensus doesn't require anymore `Node` as a circular dependency.
* Rebased upon main.
* Removed engine beacon chain dependency.
* Fixed nil error.
* Fixed error.
* bump libp2p to version 0.24.0 and update its dependencies and relevant tests
* fix format, remove wrongly added configs
* add back wrongly deleted comment
* fix travis go checker
Co-authored-by: Konstantin <355847+Frozen@users.noreply.github.com>
Co-authored-by: “GheisMohammadi” <“Gheis.Mohammadi@gmail.com”>
2 years ago
Jason Yi
a928fe4ab7
feat: make log to console as optional ( #4208 )
...
* fix: add option for console only
Signed-off-by: Jason Yi <jasonhk.yi@consensys.net>
* fix: add console option for node & harmony
Signed-off-by: Jason Yi <jasonhk.yi@consensys.net>
* fix: add console to default config
Signed-off-by: Jason Yi <jasonhk.yi@consensys.net>
* fix: remove debugging code
Signed-off-by: Jason Yi <jasonhk.yi@consensys.net>
* fix: add log.console to cmd line options
Signed-off-by: Jason Yi <jasonhk.yi@consensys.net>
* fix: linting & revert back msg.pg.go
Signed-off-by: Jason Yi <jasonhk.yi@consensys.net>
* undo changes in go.sum
Signed-off-by: Jason Yi <jasonhk.yi@consensys.net>
* update: config migration
Signed-off-by: Jason Yi <jasonhk.yi@consensys.net>
2 years ago
yahtoo
c950b30644
change max conn per IP default to 10
3 years ago
yahtoo
1133948ea9
Feat: mitigate single-Host P2P sybil attack
3 years ago
gab-nando
e08fd4199f
Add flag to allow configuring log rotation via lumberjack ( #3889 )
...
* Add flag to allow configuring log rotation via lumberjack
3 years ago
Jacky Wang
3d6858aba5
[P2P] Added functionality to Host for stream, replaced networkInfo service. ( #3534 )
...
1. Added some functionality to HostV2 for stream support.
2. Added new module discovery under p2p host to replace the networkInfo service.
3. Make dht datastore badger only active on bootstrap nodes. For normal nodes, badger is disabled by default. It can also be enabled by flags.
Co-authored-by: Rongjian Lan <rongjian.lan@gmail.com>
4 years ago
Leo Chen
382f9ee190
[p2p] upgrade kad-dht module
...
Signed-off-by: Leo Chen <leo@harmony.one>
4 years ago
Edgar Aroutiounian
2afd8a54c4
[p2p] Throttle receive with constant cost function ( #2819 )
...
* [node] Unused package level big.Int
* [p2p] Throttle receives to a max of 100
* [project] Remove msgq
* [node][p2p] Only allow 100 max message handling at time
* [node][p2p] Throttle max message handler with Weighted Semaphore - init w/ uniform weight
* [node] Use go routine for passing handled block
* [p2p] Leftover commented out
* [node] Add log for when cannot pay semaphore cost
* [node] Bump max message handlers
* [internal] Remove file_embed
* [project] Remove unused file, unused function
* [consensus] Unused values
* [config] Unused field & function
* [internal] Unused address & hash
* [project] More unused tests, values, types
* [project] Move conn logger just to bootnode
* [rpc] Remove dead functions
* [internal] More unused functions
* [project] Remove dead keystore dir package
* [p2p] Need lock to grab all Topics
* [node] Force side effect of topic join, give each topic own weighted semaphore
5 years ago
Edgar Aroutiounian
82b71619d2
[node] Redundant field removed - dead files & scripts , update deprecated libp2p package names, fold p2p code ( #2817 )
...
* [project] Remove unused test script
* [project] Remove stale testplan
* [project] Remove stale test configs
* [internal] Unused code
* [node] Remove redundnat peer count field
* [p2p] Remove leftover idea code, fix deprecated warnings
* [project] Remove .gitmodule
* [internal] Fix travis, update deprecated package usage
* [node] Remove ineffective test
* [p2p] Update deprecated package names & func usage
* [p2p] Make error explicit, remove unidiomatic return signature
* [p2p] Remove dead code, lower max p2p message size max limit
* [project][p2p] Remove dead p2p code, fold all p2p code into one file
* [p2p] Remove unsed function parameter
* [node] Add log in bootstrap
* [node] Unnecessary pointer usage
* [p2p] Unused errors.go
* [node] Log out when next consensus check in bootstrap
5 years ago
Edgar Aroutiounian
4e85d7d866
[service][node] Project Tech debt clean up, remove wallet ( #2664 )
...
* [project][p2p] Remove wallet, client roles & associated function calls
* [node][service] Remove unused service types
* [wallet] Remove internal wallet code
* [test] Remove wallet from debug.sh
* [test] More cleanup in debug.sh, deploy.sh
* [test] Adjust duration back into local test script
* [test] Increase duration
* [test] Exit with 0, remove RESULT_FILE as not made anymore
5 years ago
Eugene Kim
c9febf402a
Emit fatal init error details to stderr w/o panics
5 years ago
Leo Chen
80b325fa1a
[bootnode] use ds-badger as persistent dht datastore
...
Signed-off-by: Leo Chen <leo@harmony.one>
5 years ago
Leo Chen
2d8bf7198e
[bootnode] set kbucket size to 50
...
Signed-off-by: Leo Chen <leo@harmony.one>
5 years ago
Leo Chen
1be0bccce1
[bootnode] fix local/jenkins test after using zerolog
...
Signed-off-by: Leo Chen <leo@harmony.one>
5 years ago
Kai Lee
9c0b47c73a
Add ZeroLogger to utils
5 years ago
Kai Lee
a856b1ae04
Move log file rotation StreamHandler setup to utils
5 years ago
Kai Lee
f334a1d8fa
Rotate log files in bootnode cmd
5 years ago
Eugene Kim
f8b04145ff
Make harmony/bootnode log connections to singleton
6 years ago
Eugene Kim
6fdfd968c3
Make connection logger take a custom logger
6 years ago
Eugene Kim
75defed1ff
Make bootnode log connections
6 years ago
Peter Chung
d9b8fe57ca
[logging] change default verbosity to 5 for jenkins test
6 years ago
Peter Chung
b632fd277a
[logging] use GlogHandler as the base handler
6 years ago
Peter Chung
01f69f2e7a
[logging] add verbosity flag to bootnode, txgen, harmony cmd
6 years ago
Leo Chen
94be80920d
load both pub/priv p2p keys
...
Signed-off-by: Leo Chen <leo@harmony.one>
6 years ago
Leo Chen
5e6c919d61
fix a typo of ma
...
Signed-off-by: Leo Chen <leo@harmony.one>
6 years ago
Leo Chen
49d46a16d7
bootstrap DHT in bootnode
...
Signed-off-by: Leo Chen <leo@harmony.one>
6 years ago
Leo Chen
e7b867425f
move the key save/load functions to utils package
...
Signed-off-by: Leo Chen <leo@harmony.one>
6 years ago
Leo Chen
21f2d46e29
use p2pimpl/host module to init bootnode
...
Signed-off-by: Leo Chen <leo@harmony.one>
6 years ago
Leo Chen
82f4a1751d
add skeleton of bootnode
...
support save/load private key to .bnkey file
Signed-off-by: Leo Chen <leo@harmony.one>
6 years ago