Skip to content

Commit ffd7289

Browse files
committed
Merge branch 'feature/test-whitelist-validators' into user/james/feature/permissioned-validators
* feature/test-whitelist-validators: Add support for calling sifnoded add-genesis-validators to integration tests [Frontend] Feature/Notifications (#389) fix issues 7 and 8 auditors found (#411) chains/ethereum: yarn add truffle (incl for local) (#413) feature wait 50 blocks to process Ethereum events (#338) Integration scripts now do all transfers in python and have better waiting (#410) [Frontend] Apply testing to CLP API. Apply fixes for breaking changes. (#409) Fix/peggy docs (#406) Tests for block delay (#407) Smart Contract Clean up #1, silence test warnings, fix smart contract issues (#403) Extract assets out of config (#390) Fix to format the tag name. (#400) added asset details to query liquidity provider response (#398) [Peggy] Test improvments and add test for ceth => eth (#396) Clp tut (#395) Workflow fixes. (#399) [ChainOps] feature/k8s-tutorial (#397)
2 parents 9a0ec36 + 92c5238 commit ffd7289

File tree

84 files changed

+2995
-1154
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

84 files changed

+2995
-1154
lines changed

Diff for: .github/workflows/integrationtest.yml

+5
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,8 @@ jobs:
1212
run: |
1313
source $HOME/.bash_profile
1414
bash test/integration/start-integration-env.sh
15+
- name: Archive integration output
16+
uses: actions/upload-artifact@v2
17+
with:
18+
name: integrationoutput.tar
19+
path: test/integration/vagrant/datafiles.tar

Diff for: .github/workflows/mainnet.yml

-31
This file was deleted.

Diff for: .github/workflows/merged.yml

-48
This file was deleted.

Diff for: .github/workflows/release.yml

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
name: Publish Release Images
2+
3+
on:
4+
release:
5+
type: created
6+
7+
jobs:
8+
release:
9+
name: release
10+
runs-on: ubuntu-latest
11+
steps:
12+
- name: Check out the repo
13+
uses: actions/checkout@v2
14+
15+
- name: Login to Docker Hub
16+
run: docker login -u ${{ secrets.DOCKERHUB_USERNAME }} -p ${{ secrets.DOCKERHUB_TOKEN }}
17+
18+
- name: Inject slug/short variables
19+
uses: rlespinasse/github-slug-action@v2.x
20+
21+
- name: Build images
22+
run: |
23+
make CHAINNET=${{ env.GITHUB_REF_SLUG }} BINARY=sifnoded build-image
24+
make CHAINNET=${{ env.GITHUB_REF_SLUG }} BINARY=sifnodecli build-image
25+
make CHAINNET=${{ env.GITHUB_REF_SLUG }} BINARY=sifcrg build-image
26+
make CHAINNET=${{ env.GITHUB_REF_SLUG }} BINARY=ebrelayer build-image
27+
cd ./api/openapi
28+
make CHAINNET=${{ env.GITHUB_REF_SLUG }} build-image-swagger-iu
29+
make CHAINNET=${{ env.GITHUB_REF_SLUG }} build-image-prim
30+
31+
- name: Push images
32+
run: |
33+
docker push sifchain/sifnoded:${{ env.GITHUB_REF_SLUG }}
34+
docker push sifchain/sifnodecli:${{ env.GITHUB_REF_SLUG }}
35+
docker push sifchain/sifcrg:${{ env.GITHUB_REF_SLUG }}
36+
docker push sifchain/swagger-ui:${{ env.GITHUB_REF_SLUG }}
37+
docker push sifchain/prism:${{ env.GITHUB_REF_SLUG }}
38+
docker push sifchain/ebrelayer:${{ env.GITHUB_REF_SLUG }}

Diff for: .github/workflows/testnet.yml

-34
This file was deleted.

Diff for: cmd/ebrelayer/relayer/ethereum.go

+75-22
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,11 @@ type EthereumSub struct {
5050
TxBldr authtypes.TxBuilder
5151
PrivateKey *ecdsa.PrivateKey
5252
TempPassword string
53+
EventsBuffer types.EthEventBuffer
5354
Logger tmLog.Logger
5455
}
5556

57+
// NewKeybase create a new keybase instance
5658
func NewKeybase(validatorMoniker, mnemonic, password string) (keys.Keybase, keys.Info, error) {
5759
keybase := keys.NewInMemory()
5860
hdpath := *hd.NewFundraiserParams(0, sdk.CoinType, 0)
@@ -97,6 +99,7 @@ func NewEthereumSub(inBuf io.Reader, rpcURL string, cdc *codec.Codec, validatorM
9799
TxBldr: txBldr,
98100
PrivateKey: privateKey,
99101
TempPassword: tempPassword,
102+
EventsBuffer: types.NewEthEventBuffer(),
100103
Logger: logger,
101104
}, nil
102105
}
@@ -158,8 +161,16 @@ func (sub EthereumSub) Start(completionEvent *sync.WaitGroup) {
158161
bridgeBankAddress, subBridgeBank := sub.startContractEventSub(logs, client, txs.BridgeBank)
159162
defer subBridgeBank.Unsubscribe()
160163
bridgeBankContractABI := contract.LoadABI(txs.BridgeBank)
161-
eventLogLockSignature := bridgeBankContractABI.Events[types.LogLock.String()].ID().Hex()
162-
eventLogBurnSignature := bridgeBankContractABI.Events[types.LogBurn.String()].ID().Hex()
164+
165+
// Listen the new header
166+
heads := make(chan *ctypes.Header)
167+
defer close(heads)
168+
subHead, err := client.SubscribeNewHead(context.Background(), heads)
169+
if err != nil {
170+
log.Println(err)
171+
return
172+
}
173+
defer subHead.Unsubscribe()
163174

164175
for {
165176
select {
@@ -171,26 +182,47 @@ func (sub EthereumSub) Start(completionEvent *sync.WaitGroup) {
171182
completionEvent.Add(1)
172183
go sub.Start(completionEvent)
173184
return
185+
case err := <-subHead.Err():
186+
sub.Logger.Error(err.Error())
187+
completionEvent.Add(1)
188+
go sub.Start(completionEvent)
189+
return
190+
case newHead := <-heads:
191+
sub.Logger.Info(fmt.Sprintf("New header %d with hash %v", newHead.Number, newHead.Hash()))
192+
193+
// Add new header info to buffer
194+
sub.EventsBuffer.AddHeader(newHead.Number, newHead.Hash(), newHead.ParentHash)
195+
196+
for {
197+
fifty := big.NewInt(50)
198+
fifty.Add(fifty, sub.EventsBuffer.MinHeight)
199+
if fifty.Cmp(newHead.Number) <= 0 {
200+
events := sub.EventsBuffer.GetHeaderEvents()
201+
for _, event := range events {
202+
err := sub.handleEthereumEvent(event)
203+
204+
if err != nil {
205+
sub.Logger.Error(err.Error())
206+
completionEvent.Add(1)
207+
}
208+
}
209+
210+
sub.EventsBuffer.RemoveHeight()
211+
212+
} else {
213+
break
214+
}
215+
}
216+
174217
// vLog is raw event data
175218
case vLog := <-logs:
176219
sub.Logger.Info(fmt.Sprintf("Witnessed tx %s on block %d\n", vLog.TxHash.Hex(), vLog.BlockNumber))
177-
log.Println("Found event from the ethereum bridgebank contract: ", types.LogLock.String())
178-
var err error
179-
switch vLog.Topics[0].Hex() {
180-
case eventLogBurnSignature:
181-
err = sub.handleEthereumEvent(clientChainID, bridgeBankAddress, bridgeBankContractABI,
182-
types.LogBurn.String(), vLog)
183-
case eventLogLockSignature:
184-
log.Println("Found loglock event from the ethereum bridgebank contract: ", types.LogLock.String())
185-
err = sub.handleEthereumEvent(clientChainID, bridgeBankAddress, bridgeBankContractABI,
186-
types.LogLock.String(), vLog)
187-
}
188-
// TODO: Check local events store for status, if retryable, attempt relay again
220+
event, isBurnLock, err := sub.logToEvent(clientChainID, bridgeBankAddress, bridgeBankContractABI, vLog)
189221
if err != nil {
190-
sub.Logger.Error(err.Error())
191-
completionEvent.Add(1)
192-
go sub.Start(completionEvent)
193-
return
222+
sub.Logger.Error("Failed to get event from ethereum log")
223+
} else if isBurnLock {
224+
sub.Logger.Info("Add event into buffer")
225+
sub.EventsBuffer.AddEvent(big.NewInt(int64(vLog.BlockNumber)), vLog.BlockHash, event)
194226
}
195227
}
196228
}
@@ -219,14 +251,31 @@ func (sub EthereumSub) startContractEventSub(logs chan ctypes.Log, client *ethcl
219251
return subContractAddress, contractSub
220252
}
221253

222-
// handleEthereumEvent unpacks an Ethereum event, converts it to a ProphecyClaim, and relays a tx to Cosmos
223-
func (sub EthereumSub) handleEthereumEvent(clientChainID *big.Int, contractAddress common.Address,
224-
contractABI abi.ABI, eventName string, cLog ctypes.Log) error {
254+
// logToEvent unpacks an Ethereum event
255+
func (sub EthereumSub) logToEvent(clientChainID *big.Int, contractAddress common.Address,
256+
contractABI abi.ABI, cLog ctypes.Log) (types.EthereumEvent, bool, error) {
225257
// Parse the event's attributes via contract ABI
226258
event := types.EthereumEvent{}
259+
eventLogLockSignature := contractABI.Events[types.LogLock.String()].ID().Hex()
260+
eventLogBurnSignature := contractABI.Events[types.LogBurn.String()].ID().Hex()
261+
262+
var eventName string
263+
switch cLog.Topics[0].Hex() {
264+
case eventLogBurnSignature:
265+
eventName = types.LogBurn.String()
266+
case eventLogLockSignature:
267+
eventName = types.LogLock.String()
268+
}
269+
270+
// If event is not expected
271+
if eventName == "" {
272+
return event, false, nil
273+
}
274+
227275
err := contractABI.Unpack(&event, eventName, cLog.Data)
228276
if err != nil {
229-
sub.Logger.Error("error unpacking: %v", err)
277+
sub.Logger.Error(err.Error())
278+
return event, false, err
230279
}
231280
event.BridgeContractAddress = contractAddress
232281
event.EthereumChainID = clientChainID
@@ -239,7 +288,11 @@ func (sub EthereumSub) handleEthereumEvent(clientChainID *big.Int, contractAddre
239288

240289
// Add the event to the record
241290
types.NewEventWrite(cLog.TxHash.Hex(), event)
291+
return event, true, nil
292+
}
242293

294+
// handleEthereumEvent unpacks an Ethereum event, converts it to a ProphecyClaim, and relays a tx to Cosmos
295+
func (sub EthereumSub) handleEthereumEvent(event types.EthereumEvent) error {
243296
prophecyClaim, err := txs.EthereumEventToEthBridgeClaim(sub.ValidatorAddress, &event)
244297
if err != nil {
245298
return err

0 commit comments

Comments
 (0)