From 9fd745d62ec08e7b538a6732a640a1e70ffc635d Mon Sep 17 00:00:00 2001 From: Ryan Date: Thu, 22 Jul 2021 15:24:38 +0800 Subject: [PATCH] fix(solana): support string-based addresses in burn logs --- .github/workflows/go.yml | 2 +- go.mod | 4 ++-- go.sum | 4 ++++ watcher/watcher.go | 33 +++++++-------------------------- watcher/watcher_test.go | 2 +- 5 files changed, 15 insertions(+), 30 deletions(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 575fe452..419e47d0 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -5,7 +5,7 @@ jobs: runs-on: ubuntu-latest env: FILECOIN_FFI_COMMIT: 8b97bd8230b77bd32f4f27e4766a6d8a03b4e801 - SOLANA_FFI_COMMIT: 1f85d47b5331a2146834bbd28a51654134aedd7d + SOLANA_FFI_COMMIT: 1428533377eb4ce00e81d04a53bad92f5339db00 services: solana: image: renbot/ren-solana:latest diff --git a/go.mod b/go.mod index 5768cf83..eee4f69e 100644 --- a/go.mod +++ b/go.mod @@ -19,10 +19,10 @@ require ( github.com/onsi/ginkgo v1.14.0 github.com/onsi/gomega v1.10.1 github.com/renproject/aw v0.4.1-0.20210604011747-50d6a643dc76 - github.com/renproject/darknode v0.5.3-0.20210708063137-4d3b96c44e31 + github.com/renproject/darknode v0.5.3-0.20210722061852-6c9ec26daa5b github.com/renproject/id v0.4.2 github.com/renproject/kv v1.1.2 - github.com/renproject/multichain v0.3.16 + github.com/renproject/multichain v0.3.20 github.com/renproject/pack v0.2.11 github.com/renproject/phi v0.1.0 github.com/renproject/surge v1.2.6 diff --git a/go.sum b/go.sum index d8e6dbfb..4cbfca68 100644 --- a/go.sum +++ b/go.sum @@ -1612,6 +1612,8 @@ github.com/renproject/darknode v0.5.3-0.20210629111346-e4f394804f14 h1:VfqzKf/9P github.com/renproject/darknode v0.5.3-0.20210629111346-e4f394804f14/go.mod h1:9I7UvwFCtMD1yTd7LcCLExv4kEPqO40KSypIlZsHfTI= github.com/renproject/darknode v0.5.3-0.20210708063137-4d3b96c44e31 h1:cAxTtWK7gAuAUJ5jxqzPwUNgUbLFI6eFS7E1vR9XePA= github.com/renproject/darknode v0.5.3-0.20210708063137-4d3b96c44e31/go.mod h1:9I7UvwFCtMD1yTd7LcCLExv4kEPqO40KSypIlZsHfTI= +github.com/renproject/darknode v0.5.3-0.20210722061852-6c9ec26daa5b h1:86dtkb6tveBCGqy5ITqOL6naqfHvfCWswXCqywnk22s= +github.com/renproject/darknode v0.5.3-0.20210722061852-6c9ec26daa5b/go.mod h1:OIWTAZmZG7OV5e6/t4Ppf/GWqTbZV8e5AlLhPabID8Q= github.com/renproject/hyperdrive v0.4.8 h1:p66FEsHjkhn+PegvWzk21GYeHF5S4iHJiEs5DA+p7D0= github.com/renproject/hyperdrive v0.4.8/go.mod h1:ck1cKJ0M95xwfO0vuEj7ifDjNVYFrPvat5INU70wbUc= github.com/renproject/id v0.4.2 h1:XseNDPPCJtsZjIWR7Qgf+zxy0Gt5xsLrfwpQxJt5wFQ= @@ -1620,6 +1622,8 @@ github.com/renproject/kv v1.1.2 h1:P18yHdDVJTEZ9yeyx6o82ICY1m6f+VdtAt/ouZez+AU= github.com/renproject/kv v1.1.2/go.mod h1:78bvdAtYiYxCoT9ihVhl8qdmjl7s9fST/FkRLnZ6rXY= github.com/renproject/multichain v0.3.16 h1:K7SO5lqiL1cowQpjXpIvQ7Ihjjy4sOGqtd1tGAdauHY= github.com/renproject/multichain v0.3.16/go.mod h1:9And10nVkgnTDoaX2VbA8QyP3S2qFts0VrySalzoaAY= +github.com/renproject/multichain v0.3.20 h1:tQv2FYnDXF+BGZU8gNpzwlpUZSTxiyRyJXmE6mt/diQ= +github.com/renproject/multichain v0.3.20/go.mod h1:9And10nVkgnTDoaX2VbA8QyP3S2qFts0VrySalzoaAY= github.com/renproject/pack v0.2.5/go.mod h1:pzX3Hc04RoPft89LaZJVp0xgngVGi90V7GvyC3mOGg4= github.com/renproject/pack v0.2.11 h1:TtLh/jOqB3SDwjoMODcPnQuVbySbDK4g49NJ4BAh5/4= github.com/renproject/pack v0.2.11/go.mod h1:pzX3Hc04RoPft89LaZJVp0xgngVGi90V7GvyC3mOGg4= diff --git a/watcher/watcher.go b/watcher/watcher.go index edf60f13..f5fa6e38 100644 --- a/watcher/watcher.go +++ b/watcher/watcher.go @@ -174,15 +174,11 @@ func (fetcher SolFetcher) FetchBurnLogs(ctx context.Context, from uint64, to uin return } data := accountInfo.Value.Data - - if len(data) != 65 { - resultChan <- BurnLogResult{Error: fmt.Errorf("deserializing burn log data: expected data len 65, got %v", len(data))} + amount, recipient, err := solanastate.DecodeBurnLog(data) + if err != nil { + resultChan <- BurnLogResult{Error: fmt.Errorf("failed to decode burn log : %v", err)} return } - amount := [32]byte{} - copy(amount[:], data[0:32]) - recipientLen := uint8(data[32:33][0]) - recipient := multichain.RawAddress(data[33 : 33+int(recipientLen)]) signatures, err := fetcher.client.GetSignaturesForAddress(ctx, burnLogPubk, &solanaRPC.GetSignaturesForAddressOpts{}) if err != nil { @@ -204,8 +200,8 @@ func (fetcher SolFetcher) FetchBurnLogs(ctx context.Context, from uint64, to uin result := BurnInfo{ Txid: base58.Decode(signatures[0].Signature), - Amount: pack.NewU256(amount), - ToBytes: recipient[:], + Amount: amount, + ToBytes: []byte(recipient), Nonce: nonceBytes, BlockNumber: pack.NewU64(i), } @@ -424,13 +420,7 @@ func (watcher Watcher) burnToParams(txid pack.Bytes, amount pack.U256, toBytes [ var to multichain.Address var toDecoded []byte var err error - burnChain := watcher.selector.Source() - switch burnChain { - case multichain.Solana: - to, toDecoded, err = watcher.handleAssetAddrSolana(toBytes) - default: - to, toDecoded, err = watcher.handleAssetAddrEth(toBytes) - } + to, toDecoded, err = watcher.handleAssetAddr(toBytes) if err != nil { return jsonrpc.ParamsSubmitTx{}, err } @@ -482,7 +472,7 @@ func (watcher Watcher) burnToParams(txid pack.Bytes, amount pack.U256, toBytes [ return jsonrpc.ParamsSubmitTx{Tx: transaction}, nil } -func (watcher Watcher) handleAssetAddrEth(toBytes []byte) (multichain.Address, []byte, error) { +func (watcher Watcher) handleAssetAddr(toBytes []byte) (multichain.Address, []byte, error) { // For v0 burn, `to` can be base58 encoded to := multichain.Address(toBytes) switch watcher.selector.Asset() { @@ -507,15 +497,6 @@ func (watcher Watcher) handleAssetAddrEth(toBytes []byte) (multichain.Address, [ return to, toBytes, nil } -func (watcher Watcher) handleAssetAddrSolana(toBytes []byte) (multichain.Address, []byte, error) { - encoder := AddressEncodeDecoder(watcher.selector.Asset().OriginChain(), watcher.network) - to, err := encoder.EncodeAddress(toBytes) - if err != nil { - return "", nil, fmt.Errorf("encoding raw asset address returned by solana: %v", err) - } - return to, toBytes, nil -} - func AddressEncodeDecoder(chain multichain.Chain, network multichain.Network) multichain.AddressEncodeDecoder { switch chain { case multichain.Bitcoin, multichain.DigiByte, multichain.Dogecoin: diff --git a/watcher/watcher_test.go b/watcher/watcher_test.go index c4f38756..9b4fad71 100644 --- a/watcher/watcher_test.go +++ b/watcher/watcher_test.go @@ -771,7 +771,7 @@ var _ = Describe("Watcher", func() { }, 15*time.Second).Should(Equal(BurnLogResult{Result: BurnInfo{ Txid: []byte{}, Amount: pack.NewU256FromUint64(100000000), - ToBytes: []byte{111, 156, 83, 29, 221, 210, 44, 11, 79, 156, 112, 96, 116, 20, 53, 247, 21, 98, 180, 2, 95, 155, 124, 199, 196}, + ToBytes: []byte("mumXH2WH8z8JMBuKrArV4XpNnf3xaR6Guy"), Nonce: [32]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, BlockNumber: 1, }}))