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

v1.0 tryPay #19

Merged
merged 4 commits into from
Mar 7, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
11 changes: 7 additions & 4 deletions common/model/api_request.go
Original file line number Diff line number Diff line change
@@ -1,19 +1,22 @@
package model

import "errors"
import (
"AAStarCommunity/EthPaymaster_BackService/common/types"
"errors"
)

type TryPayUserOpRequest struct {
ForceStrategyId string `json:"force_strategy_id"`
ForceNetWork string `json:"force_network"`
ForceTokens string `json:"force_tokens"`
ForceNetwork types.NetWork `json:"force_network"`
ForceToken string `json:"force_token"`
ForceEntryPointAddress string `json:"force_entrypoint_address"`
UserOperation UserOperationItem `json:"user_operation"`
Extra interface{} `json:"extra"`
}

func (request *TryPayUserOpRequest) Validate() error {
if len(request.ForceStrategyId) == 0 {
if len(request.ForceNetWork) == 0 || len(request.ForceTokens) == 0 || len(request.ForceEntryPointAddress) == 0 {
if len(request.ForceNetwork) == 0 || len(request.ForceToken) == 0 || len(request.ForceEntryPointAddress) == 0 {
return errors.New("strategy configuration illegal")
}
}
Expand Down
24 changes: 18 additions & 6 deletions common/model/api_response.go
Original file line number Diff line number Diff line change
@@ -1,18 +1,30 @@
package model

import (
"AAStarCommunity/EthPaymaster_BackService/common/types"
"math/big"
)

type TryPayUserOpResponse struct {
StrategyId string `json:"strategy_id"`
EntryPointAddress string `json:"entrypoint_address"`
PayMasterAddress string `json:"paymaster_address"`
PayMasterSignature string `json:"paymaster_signature"`
PayReceipt interface{} `json:"pay_receipt"`
PayReceipt *PayReceipt `json:"pay_receipt"`
GasInfo *ComputeGasResponse `json:"gas_info"`
}

type ComputeGasResponse struct {
StrategyId string `json:"strategy_id"`
TokenCost string `json:"token_cost"`
Network string `json:"network"`
Token string `json:"token"`
UsdCost string `json:"usd_cost"`
GasPriceInWei uint64 `json:"gas_price_wei"` // wei
GasPriceInGwei *big.Float `json:"gas_price_gwei"`
GasPriceInEther string `json:"gas_price_ether"`
TokenCost string `json:"token_cost"`
Network types.NetWork `json:"network"`
Token types.TokenType `json:"token"`
UsdCost string `json:"usd_cost"`
BlobEnable bool `json:"blob_enable"`
}
type PayReceipt struct {
TransactionHash string `json:"transaction_hash"`
Sponsor string `json:"sponsor"`
}
29 changes: 26 additions & 3 deletions common/model/strategy.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,30 @@
package model

import "AAStarCommunity/EthPaymaster_BackService/common/types"

type Strategy struct {
Id string
EntryPointAddress string
PayMasterAddress string
Id string `json:"id"`
EntryPointAddress string `json:"entrypoint_address"`
PayMasterAddress string `json:"paymaster_address"`
NetWork types.NetWork `json:"network"`
Token types.TokenType `json:"token"`
Description string `json:"description"`
ExecuteRestriction StrategyExecuteRestriction `json:"execute_restriction"`
EnableEoa bool `json:"enable_eoa"`
Enable7560 bool `json:"enable_7560"`
EnableErc20 bool `json:"enable_erc20"`
Enable4844 bool `json:"enable_4844"`
EnableCurrency bool `json:"enable_currency"`
}
type StrategyExecuteRestriction struct {
BanSenderAddress string `json:"ban_sender_address"`
EffectiveStartTime int64 `json:"effective_start_time"`
EffectiveEndTime int64 `json:"effective_end_time"`
GlobalMaxUSD int64 `json:"global_max_usd"`
GlobalMaxOpCount int64 `json:"global_max_op_count"`
DayMaxUSD int64 `json:"day_max_usd"`
}

type StrategyValidateConfig struct {
ValidateContractAddress string `json:"validate_contract_address"`
}
3 changes: 2 additions & 1 deletion common/model/user_operation.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@ type UserOperationItem struct {
Sender string `json:"sender" binding:"required"`
Nonce string `json:"nonce" binding:"required"`
InitCode string `json:"init_code"`
CallData string `json:"call_data" binding:"required"`
CallGasLimit string `json:"call_gas_limit" binding:"required"`
VerificationGasList string `json:"verification_gas_list" binding:"required"`
PerVerificationGas string `json:"per_verification_gas" binding:"required"`
PreVerificationGas string `json:"per_verification_gas" binding:"required"`
MaxFeePerGas string `json:"max_fee_per_gas" binding:"required"`
MaxPriorityFeePerGas string `json:"max_priority_fee_per_gas" binding:"required"`
Signature string `json:"signature"`
Expand Down
22 changes: 22 additions & 0 deletions common/types/chain.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package types

type NetworkInfo struct {
Name string `json:"main_net_name"`
RpcUrl string `json:"main_net_rpc_url"`
}

//type Chain string
//
//const (
// Ethereum Chain = "Ethereum"
// Arbitrum Chain = "Arbitrum"
// Optimism Chain = "Optimism"
//)

type NetWork string

const (
Ethereum NetWork = "ethereum"
Sepolia NetWork = "sepolia"
Arbitrum NetWork = "arbitrum"
)
7 changes: 7 additions & 0 deletions common/types/currency.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package types

type Currency string

const (
USD Currency = "USD"
)
8 changes: 8 additions & 0 deletions common/types/token.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package types

type TokenType string

const (
USDT TokenType = "USDT"
ETH TokenType = "ETH"
)
57 changes: 57 additions & 0 deletions common/utils/util.go
Original file line number Diff line number Diff line change
@@ -1 +1,58 @@
package utils

import (
"AAStarCommunity/EthPaymaster_BackService/common/model"
"encoding/json"
"github.com/ethereum/go-ethereum/crypto"
)

func GenerateMockUserOperation() *model.UserOperationItem {
cherry-yl-sh marked this conversation as resolved.
Show resolved Hide resolved
//TODO use config
return &model.UserOperationItem{
Sender: "0x4A2FD3215420376DA4eD32853C19E4755deeC4D1",
Nonce: "1",
InitCode: "0x",
CallData: "0xb61d27f6000000000000000000000000c206b552ab127608c3f666156c8e03a8471c72df000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000",
CallGasLimit: "39837",
VerificationGasList: "100000",
PreVerificationGas: "44020",
MaxFeePerGas: "1743509478",
MaxPriorityFeePerGas: "1500000000",
Signature: "0x760868cd7d9539c6e31c2169c4cab6817beb8247516a90e4301e929011451658623455035b83d38e987ef2e57558695040a25219c39eaa0e31a0ead16a5c925c1c",
}
}
func GenerateUserOperation() *model.UserOperationItem {
return &model.UserOperationItem{}
}

func SignUserOp(privateKeyHex string, userOp *model.UserOperationItem) ([]byte, error) {

serializedUserOp, err := json.Marshal(userOp)
if err != nil {
return nil, err
}

signature, err := SignMessage(privateKeyHex, string(serializedUserOp))
if err != nil {
return nil, err
}

return signature, nil
}
func SignMessage(privateKeyHex string, message string) ([]byte, error) {
privateKey, err := crypto.HexToECDSA(privateKeyHex)
if err != nil {
return nil, err
}

// Hash the message
hash := crypto.Keccak256([]byte(message))

// Sign the hash
signature, err := crypto.Sign(hash, privateKey)
if err != nil {
return nil, err
}

return signature, nil
}
33 changes: 33 additions & 0 deletions common/utils/util_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package utils

import (
"crypto/ecdsa"
"encoding/hex"
"fmt"
"github.com/ethereum/go-ethereum/crypto"
"github.com/stretchr/testify/assert"
"testing"
)

func TestGenerateKeypair(t *testing.T) {
privateKey, _ := crypto.GenerateKey()
privateKeyHex := crypto.FromECDSA(privateKey)
publicKey := privateKey.Public()
publicKeyECDSA, _ := publicKey.(*ecdsa.PublicKey)
publicKeyBytes := crypto.FromECDSAPub(publicKeyECDSA)
address := crypto.PubkeyToAddress(*publicKeyECDSA).Hex()
fmt.Printf("privateKeyHex: %x\n", privateKeyHex)
fmt.Printf("publicKey: %x\n", publicKeyBytes)
fmt.Printf("address: %s\n", address)
}
func TestSignUserOp(t *testing.T) {
//privateKeyHex: 1d8a58126e87e53edc7b24d58d1328230641de8c4242c135492bf5560e0ff421
//publicKey: 044eaed6b1f16e60354156fa334a094affc76d7b7061875a0b04290af9a14cc14ce2bce6ceba941856bd55c63f8199f408fff6495ce9d4c76899055972d23bdb3e
//address: 0x0E1375d18a4A2A867bEfe908E87322ad031386a6
signByte, err := SignUserOp("1d8a58126e87e53edc7b24d58d1328230641de8c4242c135492bf5560e0ff421", GenerateMockUserOperation())
assert.NoError(t, err)
fmt.Printf("signByte: %x\n", signByte)
singature := hex.EncodeToString(signByte)
fmt.Printf("singature: %s\n", singature)

}
2 changes: 1 addition & 1 deletion conf/env.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ func getConfFilePath() *string {
var Environment *Env

func init() {
envName := ProdEnv
envName := DevEnv
if len(os.Getenv(envKey)) > 0 {
envName = os.Getenv(envKey)
}
Expand Down
21 changes: 19 additions & 2 deletions docs/docs.go
Original file line number Diff line number Diff line change
Expand Up @@ -156,12 +156,12 @@ const docTemplate = `{
"type": "string"
},
"force_network": {
"type": "string"
"$ref": "#/definitions/types.NetWork"
},
"force_strategy_id": {
"type": "string"
},
"force_tokens": {
"force_token": {
"type": "string"
},
"user_operation": {
Expand All @@ -172,6 +172,7 @@ const docTemplate = `{
"model.UserOperationItem": {
"type": "object",
"required": [
"call_data",
"call_gas_limit",
"max_fee_per_gas",
"max_priority_fee_per_gas",
Expand All @@ -181,6 +182,9 @@ const docTemplate = `{
"verification_gas_list"
],
"properties": {
"call_data": {
"type": "string"
},
"call_gas_limit": {
"type": "string"
},
Expand Down Expand Up @@ -209,6 +213,19 @@ const docTemplate = `{
"type": "string"
}
}
},
"types.NetWork": {
"type": "string",
"enum": [
"ethereum",
"sepolia",
"arbitrum"
],
"x-enum-varnames": [
"Ethereum",
"Sepolia",
"Arbitrum"
]
}
},
"securityDefinitions": {
Expand Down
21 changes: 19 additions & 2 deletions docs/swagger.json
Original file line number Diff line number Diff line change
Expand Up @@ -145,12 +145,12 @@
"type": "string"
},
"force_network": {
"type": "string"
"$ref": "#/definitions/types.NetWork"
},
"force_strategy_id": {
"type": "string"
},
"force_tokens": {
"force_token": {
"type": "string"
},
"user_operation": {
Expand All @@ -161,6 +161,7 @@
"model.UserOperationItem": {
"type": "object",
"required": [
"call_data",
"call_gas_limit",
"max_fee_per_gas",
"max_priority_fee_per_gas",
Expand All @@ -170,6 +171,9 @@
"verification_gas_list"
],
"properties": {
"call_data": {
"type": "string"
},
"call_gas_limit": {
"type": "string"
},
Expand Down Expand Up @@ -198,6 +202,19 @@
"type": "string"
}
}
},
"types.NetWork": {
"type": "string",
"enum": [
"ethereum",
"sepolia",
"arbitrum"
],
"x-enum-varnames": [
"Ethereum",
"Sepolia",
"Arbitrum"
]
}
},
"securityDefinitions": {
Expand Down
Loading
Loading