Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(bridge): implement the bridge relayer #191

Merged
merged 112 commits into from
Nov 11, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
112 commits
Select commit Hold shift + click to select a range
5e71bd7
bridge tests, WIP
cyberhorsey Oct 24, 2022
f858d87
wip on a relayer. golang backend syncing ethereum messages to a the d…
cyberhorsey Oct 25, 2022
d6ba6af
default provider
cyberhorsey Oct 25, 2022
e21292d
message processing/proof generation
cyberhorsey Oct 25, 2022
97fdc1a
wip
cyberhorsey Oct 26, 2022
401c8bc
abi types
cyberhorsey Oct 26, 2022
e856efe
web3 library for simpler ABI
cyberhorsey Oct 26, 2022
c6e92ea
rm unneeded deps
cyberhorsey Oct 27, 2022
c260c0d
wip...
cyberhorsey Oct 27, 2022
a18a65f
types
cyberhorsey Oct 27, 2022
88c2b8f
Merge branch 'main' into relayer
cyberhorsey Oct 27, 2022
848d1cd
refactor, cleanup
cyberhorsey Oct 27, 2022
b75ef05
handleEvent func
cyberhorsey Oct 27, 2022
80c7597
rf
cyberhorsey Oct 27, 2022
f1da966
comments
cyberhorsey Oct 27, 2022
dc2917b
wip
cyberhorsey Oct 27, 2022
761487f
Merge branch 'bridge_tests' into relayer
cyberhorsey Oct 27, 2022
2065b1f
whole lotta WIP...
cyberhorsey Oct 28, 2022
6008b91
remove test things
cyberhorsey Oct 28, 2022
e3d3eb4
wip tests + githubactions
cyberhorsey Oct 31, 2022
7124821
merge main
cyberhorsey Oct 31, 2022
57f9ad4
test/moving/renaming
cyberhorsey Oct 31, 2022
7501907
gha
cyberhorsey Oct 31, 2022
c5bbfe4
rlp encoding is a yes, everything else massive WIP and logging...
cyberhorsey Oct 31, 2022
52e6dc8
abi encoding + rlp encodng working and decoding, still reverting tho
cyberhorsey Nov 1, 2022
c222af9
cleanup
cyberhorsey Nov 1, 2022
7cabf96
rm console logs, add V1TaikoL2 bindings, try to see if message is ver…
cyberhorsey Nov 1, 2022
ee559e4
wip
cyberhorsey Nov 2, 2022
4a61b4b
refactor to separate servces
cyberhorsey Nov 2, 2022
2049247
block header test for proof
cyberhorsey Nov 2, 2022
2ceeb70
fix some tests
cyberhorsey Nov 2, 2022
3673ce6
Crosslayer => dest
cyberhorsey Nov 2, 2022
a06dc8b
logs, tests
cyberhorsey Nov 2, 2022
7c9e7c3
estimate gas
cyberhorsey Nov 2, 2022
0d3bf33
Merge branch 'main' into relayer
cyberhorsey Nov 3, 2022
fc74a64
add iHeaderSync to relayer
cyberhorsey Nov 3, 2022
45018a0
block hash
cyberhorsey Nov 4, 2022
3aef67d
block hash
cyberhorsey Nov 4, 2022
75d5348
message comes back received
cyberhorsey Nov 4, 2022
2852601
tests
cyberhorsey Nov 4, 2022
e2d46b5
storageproof test
cyberhorsey Nov 4, 2022
347cc56
signal proof encoding test
cyberhorsey Nov 4, 2022
5027a20
log cleanup
cyberhorsey Nov 4, 2022
4089b36
wip
cyberhorsey Nov 7, 2022
f3bdf47
default env
cyberhorsey Nov 7, 2022
28899fc
l1_taiko_addr
cyberhorsey Nov 7, 2022
6ce0e3f
tests
cyberhorsey Nov 7, 2022
82eaa8d
rm hardcoded block
cyberhorsey Nov 7, 2022
7edfc25
comment
cyberhorsey Nov 7, 2022
c3a5fa8
processing works!
cyberhorsey Nov 8, 2022
aa073c8
Update auto-generated docs
cyberhorsey Nov 8, 2022
62101c8
CLI args
cyberhorsey Nov 9, 2022
7f0a78a
merge main
cyberhorsey Nov 9, 2022
4fe828d
Merge branch 'relayer' of github.com:taikochain/taiko-mono into relayer
cyberhorsey Nov 9, 2022
053f01b
remove temp bridge ui
cyberhorsey Nov 9, 2022
a344993
Update auto-generated docs
cyberhorsey Nov 9, 2022
608cb56
separate dependencies out to interfaces in prover
cyberhorsey Nov 9, 2022
770c4cd
Merge branch 'relayer' of github.com:taikochain/taiko-mono into relayer
cyberhorsey Nov 9, 2022
1b9cb1f
Update auto-generated docs
cyberhorsey Nov 9, 2022
d9ffae4
tests
cyberhorsey Nov 9, 2022
1f3a159
Merge branch 'relayer' of github.com:taikochain/taiko-mono into relayer
cyberhorsey Nov 9, 2022
62bd2c3
Update auto-generated docs
cyberhorsey Nov 9, 2022
8b34f65
sol lints
cyberhorsey Nov 9, 2022
8959e0f
Merge branch 'relayer' of github.com:taikochain/taiko-mono into relayer
cyberhorsey Nov 9, 2022
d474ec0
Update auto-generated docs
cyberhorsey Nov 9, 2022
b33c77a
event FindAllByAddress
cyberhorsey Nov 9, 2022
8f58618
Merge branch 'relayer' of github.com:taikochain/taiko-mono into relayer
cyberhorsey Nov 9, 2022
8350b4c
Update auto-generated docs
cyberhorsey Nov 9, 2022
1206781
Update packages/protocol/test/test_integration.sh
cyberhorsey Nov 10, 2022
b7ec5c0
remove unused imports
cyberhorsey Nov 10, 2022
d45097d
Update packages/protocol/contracts/test/libs/TestLibTrieProof.sol
cyberhorsey Nov 10, 2022
40b38e5
mysql_password is optional
cyberhorsey Nov 10, 2022
7ecfd1b
separate DSN w/o mysql pw
cyberhorsey Nov 10, 2022
9eb3192
Update auto-generated docs
cyberhorsey Nov 10, 2022
834b6db
Update packages/relayer/indexer/filter_then_subscribe.go
cyberhorsey Nov 10, 2022
f1ae2dd
Update auto-generated docs
cyberhorsey Nov 10, 2022
4cd80a1
check if message owner is relayer addr
cyberhorsey Nov 10, 2022
74c8163
Merge branch 'relayer' of github.com:taikochain/taiko-mono into relayer
cyberhorsey Nov 10, 2022
dacb9a9
Update packages/relayer/indexer/filter_then_subscribe.go
cyberhorsey Nov 10, 2022
5e89d9d
Update auto-generated docs
cyberhorsey Nov 10, 2022
7241551
golangcilint job + check err for CallContext
cyberhorsey Nov 10, 2022
6069877
Merge branch 'relayer' of github.com:taikochain/taiko-mono into relayer
cyberhorsey Nov 10, 2022
6811ec1
wait for receipt + check status in process_message
cyberhorsey Nov 10, 2022
181e711
change hashing to go-ethereum lib
cyberhorsey Nov 10, 2022
0e70796
Update auto-generated docs
cyberhorsey Nov 10, 2022
122047a
abigen script, remove abis, add to gitignore
cyberhorsey Nov 10, 2022
a91405a
Merge branch 'relayer' of github.com:taikochain/taiko-mono into relayer
cyberhorsey Nov 10, 2022
5e46901
skip-dirs
cyberhorsey Nov 10, 2022
1bc1c3d
Update auto-generated docs
cyberhorsey Nov 10, 2022
23b55df
lints
cyberhorsey Nov 10, 2022
764ebef
lints
cyberhorsey Nov 10, 2022
4f9f8c5
Merge branch 'relayer' of github.com:taikochain/taiko-mono into relayer
cyberhorsey Nov 10, 2022
7947531
Update auto-generated docs
cyberhorsey Nov 10, 2022
590db94
Merge branch 'main' into relayer
cyberhorsey Nov 10, 2022
233b5fc
pass config file to gha
cyberhorsey Nov 10, 2022
aa4c712
Merge branch 'relayer' of github.com:taikochain/taiko-mono into relayer
cyberhorsey Nov 10, 2022
ff2b34d
args
cyberhorsey Nov 10, 2022
a3e71d4
args
cyberhorsey Nov 10, 2022
a7a838e
latest
cyberhorsey Nov 10, 2022
33d1f77
Update auto-generated docs
cyberhorsey Nov 10, 2022
97e9c1a
use go 1.19
cyberhorsey Nov 10, 2022
d1ea418
Merge branch 'relayer' of github.com:taikochain/taiko-mono into relayer
cyberhorsey Nov 10, 2022
993c7ed
Update auto-generated docs
cyberhorsey Nov 10, 2022
703dd6f
basic readme
cyberhorsey Nov 10, 2022
6ca9a55
Merge branch 'relayer' of github.com:taikochain/taiko-mono into relayer
cyberhorsey Nov 10, 2022
e811cfd
Update auto-generated docs
cyberhorsey Nov 11, 2022
495bf5d
goose
cyberhorsey Nov 11, 2022
8c2c18b
Merge branch 'relayer' of github.com:taikochain/taiko-mono into relayer
cyberhorsey Nov 11, 2022
a912c27
Update auto-generated docs
cyberhorsey Nov 11, 2022
d7b3e22
receipt fixes for unnecessary status check, remove dead code
cyberhorsey Nov 11, 2022
c2413fe
Merge branch 'relayer' of github.com:taikochain/taiko-mono into relayer
cyberhorsey Nov 11, 2022
e13ada7
Merge branch 'main' into relayer
cyberhorsey Nov 11, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 47 additions & 0 deletions .github/workflows/golang.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
name: Golang

on:
push:
branches: [main]
paths:
- "packages/relayer/**"
pull_request:
paths:
- "packages/relayer/**"

jobs:
lint:
name: lint
runs-on: ubuntu-latest
steps:
- uses: actions/setup-go@v3
with:
go-version: 1.19
- uses: actions/checkout@v3
- name: golangci-lint
uses: golangci/golangci-lint-action@v3
with:
# Optional: version of golangci-lint to use in form of v1.2 or v1.2.3 or `latest` to use the latest version
version: latest

# Optional: working directory, useful for monorepos
working-directory: ./packages/relayer
args: --config=.golangci.yml

build:
runs-on: ubuntu-latest
needs: lint
steps:
- name: Cancel Previous Runs
uses: styfle/cancel-workflow-action@0.11.0
with:
access_token: ${{ github.token }}

- uses: actions/checkout@v3
cyberhorsey marked this conversation as resolved.
Show resolved Hide resolved
- uses: actions/setup-go@v3
with:
go-version: ">=1.19.0"

- name: relayer - Unit Tests
working-directory: ./packages/relayer
run: go test ./... -count=1
71 changes: 71 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
module github.com/taikochain/taiko-mono

go 1.19

replace github.com/umbracle/ethgo => ../../ethgo

require (
github.com/cyberhorsey/errors v0.0.0-20220929234051-087d6d8bb841
github.com/ethereum/go-ethereum v1.10.25
github.com/joho/godotenv v1.4.0
github.com/pkg/errors v0.9.1
github.com/pressly/goose/v3 v3.7.0
github.com/sirupsen/logrus v1.9.0
github.com/stretchr/testify v1.8.0
github.com/testcontainers/testcontainers-go v0.15.0
gopkg.in/go-playground/assert.v1 v1.2.1
gorm.io/datatypes v1.0.7
gorm.io/driver/mysql v1.4.3
gorm.io/gorm v1.24.0
)

require (
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect
github.com/Microsoft/go-winio v0.5.2 // indirect
github.com/Microsoft/hcsshim v0.9.4 // indirect
github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 // indirect
github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect
github.com/cenkalti/backoff/v4 v4.1.3 // indirect
github.com/containerd/cgroups v1.0.4 // indirect
github.com/containerd/containerd v1.6.8 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/deckarep/golang-set v1.8.0 // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect
github.com/docker/distribution v2.8.1+incompatible // indirect
github.com/docker/docker v20.10.17+incompatible // indirect
github.com/docker/go-connections v0.4.0 // indirect
github.com/docker/go-units v0.5.0 // indirect
github.com/go-ole/go-ole v1.2.1 // indirect
github.com/go-sql-driver/mysql v1.6.0 // indirect
github.com/go-stack/stack v1.8.0 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/google/uuid v1.3.0 // indirect
github.com/gorilla/websocket v1.4.2 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/magiconair/properties v1.8.6 // indirect
github.com/moby/sys/mount v0.3.3 // indirect
github.com/moby/sys/mountinfo v0.6.2 // indirect
github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae // indirect
github.com/morikuni/aec v1.0.0 // indirect
github.com/opencontainers/go-digest v1.0.0 // indirect
github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 // indirect
github.com/opencontainers/runc v1.1.3 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/rjeczalik/notify v0.9.1 // indirect
github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect
github.com/tklauser/go-sysconf v0.3.5 // indirect
github.com/tklauser/numcpus v0.2.2 // indirect
github.com/tyler-smith/go-bip39 v1.1.0 // indirect
go.opencensus.io v0.23.0 // indirect
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa // indirect
golang.org/x/net v0.0.0-20220812174116-3211cb980234 // indirect
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab // indirect
google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad // indirect
google.golang.org/grpc v1.47.0 // indirect
google.golang.org/protobuf v1.28.0 // indirect
gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
1,324 changes: 1,324 additions & 0 deletions go.sum

Large diffs are not rendered by default.

27 changes: 27 additions & 0 deletions packages/protocol/test/bridge/libs/LibBridgeData.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,33 @@ describe("LibBridgeData", function () {

expect(expectedHash).to.be.eq(hashed)
})

it("should return properly hashed message from actual bridge message", async function () {
const { libData } = await deployLibBridgeDataFixture()
// dummy struct to test with

const testMessage = {
id: 0,
sender: "0xDA1Ea1362475997419D2055dD43390AEE34c6c37",
srcChainId: 31336,
destChainId: 167001,
owner: "0x4Ec242468812B6fFC8Be8FF423Af7bd23108d991",
to: "0xF58b02228125baF4B232FF3F2f66F8b9229d5177",
refundAddress: "0x4Ec242468812B6fFC8Be8FF423Af7bd23108d991",
depositValue: 0,
callValue: 0,
processingFee: 0,
gasLimit: 1000000,
data: "0x0c6fab8200000000000000000000000000000000000000000000000000000000000000800000000000000000000000004ec242468812b6ffc8be8ff423af7bd23108d9910000000000000000000000004ec242468812b6ffc8be8ff423af7bd23108d99100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000007a68000000000000000000000000e48a03e23449975df36603c93f59a15e2de75c74000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000004544553540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000095465737445524332300000000000000000000000000000000000000000000000",
memo: "CronJob SendTokens",
}

const hashed = await libData.hashMessage(testMessage)

expect(
"0xea159ca9f8fa8d139853755222c652413568310fab38095f5700286155a5179b"
).to.be.eq(hashed)
})
})

describe("updateMessageStatus()", async function () {
Expand Down
7 changes: 4 additions & 3 deletions packages/protocol/test/bridge/libs/LibBridgeSignal.test.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import { expect } from "chai"
import { ethers } from "hardhat"
import { TestLibBridgeSignal } from "../../../typechain"

describe("LibBridgeSignal", function () {
describe("integration:LibBridgeSignal", function () {
async function deployLibBridgeSignalFixture() {
const [owner, nonOwner] = await ethers.getSigners()

const libSignal = await (
const libSignal: TestLibBridgeSignal = await (
await ethers.getContractFactory("TestLibBridgeSignal")
).deploy()

Expand All @@ -15,7 +16,7 @@ describe("LibBridgeSignal", function () {
srcChainId: 1,
destChainId: 2,
owner: owner.address,
to: nonOwner.address,
to: owner.address,
refundAddress: owner.address,
depositValue: 0,
callValue: 0,
Expand Down
19 changes: 5 additions & 14 deletions packages/protocol/test/libs/LibTrieProof.test.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,11 @@
import { expect } from "chai"
import { ENOBUFS } from "constants"
import { BigNumber } from "ethers"
import { ethers } from "hardhat"
import RLP from "rlp"
import { Message } from "../utils/message"
import { EthGetProofResponse } from "../utils/rpc"

type StorageEntry = {
key: string
value: string
proof: string[] // Array of rlp-serialized MerkleTree-Nodes, starting with the storageHash-Node,
}
type EthGetProofResponse = {
balance: string
codeHash: string
nonce: string
storageHash: string
accountProof: string[] // array of rlp-serialized merkle nodes beginning with stateRoot-node
storageProof: StorageEntry[]
}
describe("integration:LibTrieProof", function () {
async function deployLibTrieProofFixture() {
const libTrieProof = await (
Expand All @@ -39,7 +29,7 @@ describe("integration:LibTrieProof", function () {

await addressManager.setAddress(
`${chainId}.ether_vault`,
"0x02E725B7e99091Bd4cCBf15228384e160eCdf78f"
"0xEA3dD11036f668F08940E13e3bcB097C93b09E07"
)

const libBridgeRetry = await (
Expand Down Expand Up @@ -67,6 +57,7 @@ describe("integration:LibTrieProof", function () {
await bridge.init(addressManager.address)

const [owner] = await ethers.getSigners()

return { owner, testLibTreProof, bridge }
}
describe("verify()", function () {
Expand Down
2 changes: 1 addition & 1 deletion packages/protocol/test/test_integration.sh
Original file line number Diff line number Diff line change
Expand Up @@ -59,4 +59,4 @@ trap "docker rm --force $TEST_NODE_CONTAINER_NAME $TEST_IMPORT_TEST_ACCOUNT_ETH_

# Run the tests
PRIVATE_KEY=$TEST_ACCOUNT_PRIV_KEY \
pnpm hardhat test --network l1_test --grep "^integration"
pnpm hardhat test --network l1_test --grep "^integration"
61 changes: 61 additions & 0 deletions packages/protocol/test/utils/rpc.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import { BigNumber } from "ethers"

type StorageEntry = {
key: string
value: string
proof: string[] // Array of rlp-serialized MerkleTree-Nodes, starting with the storageHash-Node,
}

type EthGetProofResponse = {
balance: string
codeHash: string
nonce: string
storageHash: string
accountProof: string[] // array of rlp-serialized merkle nodes beginning with stateRoot-node
storageProof: StorageEntry[]
}

type Block = {
number: number
hash: string
parentHash: string
nonce: number
sha3Uncles: string
logsBloom: string[]
transactionsRoot: string
stateRoot: string
receiptsRoot: string
miner: string
difficulty: number
totalDifficulty: number
extraData: string
size: number
gasLimit: number
gasUsed: number
timestamp: number
transactions: string[]
uncles: string[]
baseFeePerGas?: string
mixHash: string
}

type BlockHeader = {
parentHash: string
ommersHash: string
beneficiary: string
stateRoot: string
transactionsRoot: string
receiptsRoot: string
logsBloom: string[]
difficulty: number
height: number
gasLimit: number
gasUsed: number
timestamp: number
extraData: string
mixHash: string
nonce: number
baseFeePerGas: BigNumber
}

export { Block, BlockHeader, StorageEntry, EthGetProofResponse }
10 changes: 10 additions & 0 deletions packages/relayer/.default.env
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
HTTP_PORT=4102
MYSQL_USER=root
MYSQL_PASSWORD=root
MYSQL_DATABASE=relayer
MYSQL_HOST=localhost:3306
RELAYER_ECDSA_KEY=
L1_BRIDGE_ADDRESS=0xa566811E9E63e4F573Df89d5453bB89F239F7e10
L2_BRIDGE_ADDRESS=0xa566811E9E63e4F573Df89d5453bB89F239F7e10
L1_RPC_URL="wss://eth-goerli.g.alchemy.com/v2/bPAA5rQ42Zoo4ts9TYnTB2t0cuc5lf7_"
L2_RPC_URL="wss://rinkeby-light.eth.linkpool.io/ws"
47 changes: 47 additions & 0 deletions packages/relayer/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
.netrc
.env
.test.env
main
coverage/profile.cov
coverage/gitlab.xml

# Local .terraform directories
.terraform

# .tfstate files
*.tfstate
*.tfstate.*

# Crash log files
crash.log

# Exclude all .tfvars files, which are likely to contain sentitive data, such as
# password, private keys, and other secrets. These should not be part of version
# control as they are data points which are potentially sensitive and subject
# to change depending on the environment.
#
*.tfvars

# Ignore override files as they are usually used to override resources locally and so
# are not checked in
override.tf
override.tf.json
*_override.tf
*_override.tf.json

# Include override files you do wish to add to version control using negated pattern
#
# !example_override.tf

# Include tfplan files to ignore the plan output of command: terraform plan -out=tfplan
# example: *tfplan*

# Ignore CLI configuration files
.terraformrc
terraform.rc

.idea

Bridge.json
V1TaikoL2.json
IHeaderSync.json
42 changes: 42 additions & 0 deletions packages/relayer/.golangci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# See: https://golangci-lint.run/usage/configuration/
#
# Note: for VSCode, you must have the following settings to use this configuration:
#
# "go.lintTool": "golangci-lint",
# "go.lintFlags": [
# "--fast",
# "--config=${workspaceFolder}/.golangci.yml"
# ],

output:
format: colored-line-number

linters:
enable:
- funlen
- gocognit
- gocritic
- gofmt
- golint
- gosec
- lll
- whitespace
- wsl

linters-settings:
funlen:
lines: 100
statements: 45
gocognit:
min-complexity: 32

issues:
exclude-rules:
# Exclude some linters from running on tests files.
- path: _test\.go
linters:
- funlen

run:
skip-dirs:
- contracts/*
Loading