Skip to content

Commit

Permalink
add v3
Browse files Browse the repository at this point in the history
  • Loading branch information
envestcc committed May 21, 2024
1 parent c3e66c5 commit 85899df
Show file tree
Hide file tree
Showing 9 changed files with 621 additions and 61 deletions.
12 changes: 6 additions & 6 deletions action/protocol/staking/ethabi/v3/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,12 @@ func BuildReadStateRequest(data []byte) (protocol.StateContext, error) {
switch methodSig := hex.EncodeToString(data[:4]); methodSig {
case hex.EncodeToString(_compositeBucketsMethod.ID):
return newCompositeBucketsStateContext(data[4:])
// case hex.EncodeToString(_compositeBucketsByCandidateMethod.ID):
// return newCompositeBucketsByCandidateStateContext(data[4:])
// case hex.EncodeToString(_compositeBucketsByIndexesMethod.ID):
// return newCompositeBucketsByIndexesStateContext(data[4:])
// case hex.EncodeToString(_compositeBucketsByVoterMethod.ID):
// return newCompositeBucketsByVoterStateContext(data[4:])
case hex.EncodeToString(_compositeBucketsByCandidateMethod.ID):
return newCompositeBucketsByCandidateStateContext(data[4:])
case hex.EncodeToString(_compositeBucketsByIndexesMethod.ID):
return newCompositeBucketsByIndexesStateContext(data[4:])
case hex.EncodeToString(_compositeBucketsByVoterMethod.ID):
return newCompositeBucketsByVoterStateContext(data[4:])
default:
return nil, stakingComm.ErrInvalidCallSig
}
Expand Down
57 changes: 2 additions & 55 deletions action/protocol/staking/ethabi/v3/stake_composite_buckets.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@ package v3
import (
"github.com/ethereum/go-ethereum/accounts/abi"
"github.com/iotexproject/iotex-proto/golang/iotexapi"
"github.com/iotexproject/iotex-proto/golang/iotextypes"
"google.golang.org/protobuf/proto"

"github.com/iotexproject/iotex-core/action/protocol"
"github.com/iotexproject/iotex-core/action/protocol/abiutil"
Expand Down Expand Up @@ -126,57 +124,6 @@ type CompositeBucketsStateContext struct {
*protocol.BaseStateContext
}

func newCompositeBucketsStateContext(data []byte) (*CompositeBucketsStateContext, error) {
paramsMap := map[string]interface{}{}
ok := false
if err := _compositeBucketsMethod.Inputs.UnpackIntoMap(paramsMap, data); err != nil {
return nil, err
}
var offset, limit uint32
if offset, ok = paramsMap["offset"].(uint32); !ok {
return nil, stakingComm.ErrDecodeFailure
}
if limit, ok = paramsMap["limit"].(uint32); !ok {
return nil, stakingComm.ErrDecodeFailure
}

method := &iotexapi.ReadStakingDataMethod{
Method: iotexapi.ReadStakingDataMethod_COMPOSITE_BUCKETS,
}
methodBytes, err := proto.Marshal(method)
if err != nil {
return nil, err
}
arguments := &iotexapi.ReadStakingDataRequest{
Request: &iotexapi.ReadStakingDataRequest_Buckets{
Buckets: &iotexapi.ReadStakingDataRequest_VoteBuckets{
Pagination: &iotexapi.PaginationParam{
Offset: offset,
Limit: limit,
},
},
},
}
argumentsBytes, err := proto.Marshal(arguments)
if err != nil {
return nil, err
}
return &CompositeBucketsStateContext{
&protocol.BaseStateContext{
Parameter: &protocol.Parameters{
MethodName: methodBytes,
Arguments: [][]byte{argumentsBytes},
},
},
}, nil
}

// EncodeToEth encode proto to eth
func (r *CompositeBucketsStateContext) EncodeToEth(resp *iotexapi.ReadStateResponse) (string, error) {
var result iotextypes.VoteBucketList
if err := proto.Unmarshal(resp.Data, &result); err != nil {
return "", err
}

return stakingComm.EncodeVoteBucketListToEth(_compositeBucketsMethod.Outputs, &result)
func newCompositeBucketsStateContext(data []byte) (*stakingComm.BucketsStateContext, error) {
return stakingComm.NewBucketsStateContext(data, &_compositeBucketsMethod, iotexapi.ReadStakingDataMethod_COMPOSITE_BUCKETS)
}
100 changes: 100 additions & 0 deletions action/protocol/staking/ethabi/v3/stake_composite_buckets_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
package v3

import (
"encoding/hex"
"reflect"
"testing"

"github.com/iotexproject/iotex-proto/golang/iotexapi"
"github.com/iotexproject/iotex-proto/golang/iotextypes"
"github.com/stretchr/testify/require"
"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/types/known/timestamppb"

stakingComm "github.com/iotexproject/iotex-core/action/protocol/staking/ethabi/common"
)

func TestBuildReadStateRequestCompositeBuckets(t *testing.T) {
r := require.New(t)

// data, err := _compositeBucketsMethod.Inputs.Pack(uint32(1), uint32(5))
// r.NoError(err)
// data = append(_compositeBucketsMethod.ID, data...)
// t.Logf("data: %s", hex.EncodeToString(data))

data, _ := hex.DecodeString("520f1bdc00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000005")
req, err := BuildReadStateRequest(data)

r.Nil(err)
r.EqualValues("*common.BucketsStateContext", reflect.TypeOf(req).String())

method := &iotexapi.ReadStakingDataMethod{
Method: iotexapi.ReadStakingDataMethod_COMPOSITE_BUCKETS,
}
methodBytes, _ := proto.Marshal(method)
r.EqualValues(methodBytes, req.Parameters().MethodName)

arguments := &iotexapi.ReadStakingDataRequest{
Request: &iotexapi.ReadStakingDataRequest_Buckets{
Buckets: &iotexapi.ReadStakingDataRequest_VoteBuckets{
Pagination: &iotexapi.PaginationParam{
Offset: 1,
Limit: 5,
},
},
},
}
argumentsBytes, _ := proto.Marshal(arguments)
r.EqualValues([][]byte{argumentsBytes}, req.Parameters().Arguments)
}

func TestEncodeCompositeVoteBucketListToEth(t *testing.T) {
r := require.New(t)

buckets := make([]*iotextypes.VoteBucket, 3)

buckets[0] = &iotextypes.VoteBucket{
Index: 1,
CandidateAddress: "io1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqryn4k9fw",
StakedAmount: "1000000000000000000",
StakedDuration: 1_000_000,
CreateTime: &timestamppb.Timestamp{Seconds: 1_000_000_000},
StakeStartTime: &timestamppb.Timestamp{Seconds: 1_000_000_001},
UnstakeStartTime: &timestamppb.Timestamp{Seconds: 1_000_000_002},
AutoStake: true,
Owner: "io1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqxgce2xkh",
ContractAddress: "",
}
buckets[1] = &iotextypes.VoteBucket{
Index: 2,
CandidateAddress: "io1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqr9wrzs5u",
StakedAmount: "2000000000000000000",
AutoStake: false,
Owner: "io1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqxf907nt9",
ContractAddress: "io1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqxf907nt9",
StakedDurationBlockNumber: 1_000_000,
CreateBlockHeight: 1_000_000_000,
StakeStartBlockHeight: 1_000_000_001,
UnstakeStartBlockHeight: 1_000_000_002,
}
buckets[2] = &iotextypes.VoteBucket{
Index: 2,
CandidateAddress: "io1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqr9wrzs5u",
StakedAmount: "2000000000000000000",
AutoStake: false,
Owner: "io1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqxf907nt9",
ContractAddress: "io1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqxf907nt9",
StakedDurationBlockNumber: 1_000_000,
CreateBlockHeight: 1_000_000_000,
StakeStartBlockHeight: 1_000_000_001,
UnstakeStartBlockHeight: 1_000_000_002,
EndorsementExpireBlockHeight: 300_000_000,
}

data, err := stakingComm.EncodeVoteBucketListToEth(_compositeBucketsMethod.Outputs, &iotextypes.VoteBucketList{
Buckets: buckets,
})
// t.Logf("data: %s\n", data)
r.Nil(err)
r.EqualValues("00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000003b9aca00000000000000000000000000000000000000000000000000000000003b9aca01000000000000000000000000000000000000000000000000000000003b9aca02000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000001bc16d674ec800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c900000000000000000000000000000000000000000000000000000000000000c900000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000003b9aca00000000000000000000000000000000000000000000000000000000003b9aca01000000000000000000000000000000000000000000000000000000003b9aca020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000001bc16d674ec800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c900000000000000000000000000000000000000000000000000000000000000c900000000000000000000000000000000000000000000000000000000000f4240000000000000000000000000000000000000000000000000000000003b9aca00000000000000000000000000000000000000000000000000000000003b9aca01000000000000000000000000000000000000000000000000000000003b9aca020000000000000000000000000000000000000000000000000000000000000000", data)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
package v3

import (
"github.com/ethereum/go-ethereum/accounts/abi"

"github.com/iotexproject/iotex-proto/golang/iotexapi"

"github.com/iotexproject/iotex-core/action/protocol/abiutil"
stakingComm "github.com/iotexproject/iotex-core/action/protocol/staking/ethabi/common"
)

const _compositeBucketsByCandidateInterfaceABI = `[
{
"inputs": [
{
"internalType": "string",
"name": "candName",
"type": "string"
},
{
"internalType": "uint32",
"name": "offset",
"type": "uint32"
},
{
"internalType": "uint32",
"name": "limit",
"type": "uint32"
}
],
"name": "compositeBucketsByCandidateV3",
"outputs": [
{
"components": [
{
"internalType": "uint64",
"name": "index",
"type": "uint64"
},
{
"internalType": "address",
"name": "candidateAddress",
"type": "address"
},
{
"internalType": "uint256",
"name": "stakedAmount",
"type": "uint256"
},
{
"internalType": "uint32",
"name": "stakedDuration",
"type": "uint32"
},
{
"internalType": "int64",
"name": "createTime",
"type": "int64"
},
{
"internalType": "int64",
"name": "stakeStartTime",
"type": "int64"
},
{
"internalType": "int64",
"name": "unstakeStartTime",
"type": "int64"
},
{
"internalType": "bool",
"name": "autoStake",
"type": "bool"
},
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "address",
"name": "contractAddress",
"type": "address"
},
{
"internalType": "uint64",
"name": "stakedDurationBlockNumber",
"type": "uint64"
},
{
"internalType": "uint64",
"name": "createBlockHeight",
"type": "uint64"
},
{
"internalType": "uint64",
"name": "stakeStartBlockHeight",
"type": "uint64"
},
{
"internalType": "uint64",
"name": "unstakeStartBlockHeight",
"type": "uint64"
},
{
"internalType": "uint64",
"name": "endorsementExpireBlockHeight",
"type": "uint64"
}
],
"internalType": "struct IStaking.CompositeVoteBucket[]",
"name": "",
"type": "tuple[]"
}
],
"stateMutability": "view",
"type": "function"
}
]`

var _compositeBucketsByCandidateMethod abi.Method

func init() {
_compositeBucketsByCandidateMethod = abiutil.MustLoadMethod(_compositeBucketsByCandidateInterfaceABI, "compositeBucketsByCandidateV3")
}

func newCompositeBucketsByCandidateStateContext(data []byte) (*stakingComm.BucketsByCandidateStateContext, error) {
return stakingComm.NewBucketsByCandidateStateContext(data, &_compositeBucketsByCandidateMethod, iotexapi.ReadStakingDataMethod_COMPOSITE_BUCKETS_BY_CANDIDATE)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package v3

import (
"encoding/hex"
"reflect"
"testing"

"github.com/iotexproject/iotex-proto/golang/iotexapi"
"github.com/stretchr/testify/require"
"google.golang.org/protobuf/proto"
)

func TestBuildReadStateRequestCompositeBucketsByCandidate(t *testing.T) {
r := require.New(t)

// data, err := _compositeBucketsByCandidateMethod.Inputs.Pack("hello", uint32(0), uint32(1))
// r.NoError(err)
// data = append(_compositeBucketsByCandidateMethod.ID, data...)
// t.Logf("data: %s", hex.EncodeToString(data))

data, _ := hex.DecodeString("71a3e9b9000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000568656c6c6f000000000000000000000000000000000000000000000000000000")
req, err := BuildReadStateRequest(data)

r.Nil(err)
r.EqualValues("*common.BucketsByCandidateStateContext", reflect.TypeOf(req).String())

method := &iotexapi.ReadStakingDataMethod{
Method: iotexapi.ReadStakingDataMethod_COMPOSITE_BUCKETS_BY_CANDIDATE,
}
methodBytes, _ := proto.Marshal(method)
r.EqualValues(methodBytes, req.Parameters().MethodName)

arguments := &iotexapi.ReadStakingDataRequest{
Request: &iotexapi.ReadStakingDataRequest_BucketsByCandidate{
BucketsByCandidate: &iotexapi.ReadStakingDataRequest_VoteBucketsByCandidate{
CandName: "hello",
Pagination: &iotexapi.PaginationParam{
Offset: 0,
Limit: 1,
},
},
},
}
argumentsBytes, _ := proto.Marshal(arguments)
r.EqualValues([][]byte{argumentsBytes}, req.Parameters().Arguments)
}
Loading

0 comments on commit 85899df

Please sign in to comment.