Skip to content

Commit 4ff83ad

Browse files
committed
add lock taiko
1 parent e841c24 commit 4ff83ad

File tree

7 files changed

+166
-1
lines changed

7 files changed

+166
-1
lines changed

abi/loopring.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[{"inputs":[{"internalType":"address","name":"_exchange","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint96","name":"amount","type":"uint96"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"Deposited","type":"event"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint96","name":"amount","type":"uint96"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"exchange","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

adapters/contracts/loopring/loopring.go

Lines changed: 17 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

adapters/projects/loopring/lock.go

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package loopring
2+
3+
import (
4+
"context"
5+
"math/big"
6+
"strings"
7+
8+
"github.com/ethereum/go-ethereum/accounts/abi"
9+
"github.com/ethereum/go-ethereum/common"
10+
"github.com/ethereum/go-ethereum/core/types"
11+
"github.com/ethereum/go-ethereum/crypto"
12+
"github.com/ethereum/go-ethereum/ethclient"
13+
"github.com/taikoxyz/trailblazer-adapters/adapters"
14+
"github.com/taikoxyz/trailblazer-adapters/adapters/contracts/loopring"
15+
)
16+
17+
const (
18+
// https://taikoscan.io/address/0xaD32A362645Ac9139CFb5Ba3A2A46fC4c378812B
19+
LockAddress string = "0xaD32A362645Ac9139CFb5Ba3A2A46fC4c378812B"
20+
21+
logDepositWithDurationSignature string = "Deposited(address,address,address,uint96,uint256)"
22+
)
23+
24+
type LockIndexer struct {
25+
client *ethclient.Client
26+
addresses []common.Address
27+
}
28+
29+
func NewLockIndexer(client *ethclient.Client, addresses []common.Address) *LockIndexer {
30+
return &LockIndexer{
31+
client: client,
32+
addresses: addresses,
33+
}
34+
}
35+
36+
var _ adapters.LogIndexer[adapters.Lock] = &LockIndexer{}
37+
38+
func (indexer *LockIndexer) Addresses() []common.Address {
39+
return indexer.addresses
40+
}
41+
42+
func (indexer *LockIndexer) Index(ctx context.Context, logs ...types.Log) ([]adapters.Lock, error) {
43+
var locks []adapters.Lock
44+
45+
for _, l := range logs {
46+
if !indexer.isDepositWithDuration(l) {
47+
continue
48+
}
49+
50+
var depositWithDurationEvent struct {
51+
From common.Address
52+
To common.Address
53+
Token common.Address
54+
Amount *big.Int
55+
Duration *big.Int
56+
}
57+
58+
loopringABI, err := abi.JSON(strings.NewReader(loopring.LoopringABI))
59+
if err != nil {
60+
return nil, err
61+
}
62+
63+
err = loopringABI.UnpackIntoInterface(&depositWithDurationEvent, "Deposited", l.Data)
64+
if err != nil {
65+
return nil, err
66+
}
67+
68+
if depositWithDurationEvent.Token != common.HexToAddress(adapters.TaikoTokenAddress) {
69+
continue
70+
}
71+
72+
block, err := indexer.client.BlockByNumber(ctx, big.NewInt(int64(l.BlockNumber)))
73+
if err != nil {
74+
return nil, err
75+
}
76+
77+
lock := &adapters.Lock{
78+
User: depositWithDurationEvent.To,
79+
TokenAmount: depositWithDurationEvent.Amount,
80+
TokenDecimals: adapters.TaikoTokenDecimals,
81+
Token: common.HexToAddress(adapters.TaikoTokenAddress),
82+
Duration: depositWithDurationEvent.Duration.Uint64(),
83+
BlockTime: block.Time(),
84+
BlockNumber: block.NumberU64(),
85+
TxHash: l.TxHash,
86+
}
87+
88+
locks = append(locks, *lock)
89+
}
90+
91+
return locks, nil
92+
}
93+
94+
func (indexer *LockIndexer) isDepositWithDuration(l types.Log) bool {
95+
return l.Topics[0].Hex() == crypto.Keccak256Hash([]byte(logDepositWithDurationSignature)).Hex()
96+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package loopring_test
2+
3+
import (
4+
"context"
5+
"math/big"
6+
"testing"
7+
8+
"github.com/ethereum/go-ethereum/common"
9+
"github.com/ethereum/go-ethereum/ethclient"
10+
"github.com/stretchr/testify/assert"
11+
"github.com/stretchr/testify/require"
12+
"github.com/taikoxyz/trailblazer-adapters/adapters"
13+
"github.com/taikoxyz/trailblazer-adapters/adapters/projects/loopring"
14+
)
15+
16+
func TestLockIndexer(t *testing.T) {
17+
taikoRPC := "https://rpc.taiko.xyz"
18+
blocknumber := int64(494879)
19+
20+
ctx := context.Background()
21+
22+
client, err := ethclient.Dial(taikoRPC)
23+
require.NoError(t, err)
24+
25+
indexer := loopring.NewLockIndexer(client, []common.Address{common.HexToAddress(loopring.LockAddress)})
26+
27+
logs, err := adapters.GetLogs(ctx, client, indexer.Addresses(), blocknumber)
28+
require.NoError(t, err)
29+
30+
locks, err := indexer.Index(ctx, logs...)
31+
assert.NoError(t, err)
32+
assert.Len(t, locks, 1)
33+
assert.Equal(t, common.HexToAddress("0x6b1029C9AE8Aa5EEA9e045E8ba3C93d380D5BDDa"), locks[0].To)
34+
assert.Equal(t, big.NewInt(10000000000000000000), locks[0].Amount)
35+
assert.Equal(t, adapters.TaikoTokenDecimals, locks[0].TokenDecimals)
36+
assert.Equal(t, common.HexToAddress(adapters.TaikoTokenAddress), locks[0].Token)
37+
assert.Equal(t, uint64(1730074991), locks[0].BlockTime)
38+
assert.Equal(t, uint64(259200), locks[0].Duration)
39+
assert.Equal(t, uint64(blocknumber), locks[0].BlockNumber)
40+
assert.Equal(t, common.HexToHash("0xbc5bdd53bd832a16285c8fbb7645e5ae09c8edc8b50e839fb822d88f8fe136d5"), locks[0].TxHash)
41+
}

cmd/adapter.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ const (
2121
DripsLock adapter = "DripsLock"
2222
SymmetricLock adapter = "SymmetricLock"
2323
RobinosPrediction adapter = "RobinosPrediction"
24+
LoopringLock adapter = "LoopringLock"
2425
)
2526

2627
func adapterz() []adapter {
@@ -39,5 +40,6 @@ func adapterz() []adapter {
3940
DripsLock,
4041
SymmetricLock,
4142
RobinosPrediction,
43+
LoopringLock,
4244
}
4345
}

cmd/cmd.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
"github.com/taikoxyz/trailblazer-adapters/adapters/projects/ritsu"
2626
"github.com/taikoxyz/trailblazer-adapters/adapters/projects/symmetric"
2727
"github.com/taikoxyz/trailblazer-adapters/adapters/projects/robinos"
28+
"github.com/taikoxyz/trailblazer-adapters/adapters/projects/loopring"
2829
transactionsender "github.com/taikoxyz/trailblazer-adapters/adapters/transaction_sender"
2930
)
3031

@@ -187,6 +188,12 @@ func executeCommand(p prompt) error {
187188
robinos.SelectedMultiplierEvents,
188189
)
189190
return processLog(ctx, client, indexer, p.Blocknumber)
191+
case LoopringLock:
192+
indexer := loopring.NewLockIndexer(
193+
client,
194+
[]common.Address{common.HexToAddress(loopring.LockAddress)},
195+
)
196+
return processLog(ctx, client, indexer, p.Blocknumber)
190197

191198
default:
192199
return fmt.Errorf("adapter %s is not supported", p.Adapter)

whitelist/protocols.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -736,7 +736,8 @@
736736
"logo": "loopring_logo.png",
737737
"contracts": [
738738
"0xbD787F374198d29E2F8Fa228c778FE39e1a5d3a9",
739-
"0x3e71a41325e1d6B450307b6535EC48627ac4DaCC"
739+
"0x3e71a41325e1d6B450307b6535EC48627ac4DaCC",
740+
"0xaD32A362645Ac9139CFb5Ba3A2A46fC4c378812B"
740741
]
741742
},
742743
{

0 commit comments

Comments
 (0)