Skip to content

Commit 4753700

Browse files
authored
Merge pull request #17 from rabbitprincess/feature/evm-tidy
Feature/evm tidy
2 parents 33ef041 + 546dddb commit 4753700

File tree

9 files changed

+67
-34
lines changed

9 files changed

+67
-34
lines changed

cmd/facilitator/main.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,9 @@ func run() {
4646
}
4747
log.Logger = zerolog.New(os.Stdout).With().Timestamp().Caller().Logger()
4848

49-
facilitator, err := facilitator.NewFacilitator(config.Scheme, config.Url, config.PrivateKey)
49+
facilitator, err := facilitator.NewFacilitator(config.Scheme, config.Network, config.Url, config.PrivateKey)
5050
if err != nil {
51-
log.Fatal().Err(err).
52-
Msg("Failed to create facilitator, shutting down...")
51+
log.Fatal().Err(err).Msg("Failed to create facilitator, shutting down...")
5352
}
5453

5554
api := api.NewServer(facilitator)

facilitator/evm.go

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,26 +28,29 @@ type EVMFacilitator struct {
2828
address common.Address
2929
}
3030

31-
func NewEVMFacilitator(networkOrRpcUrl string, privateKeyHex string) (*EVMFacilitator, error) {
32-
var url string
33-
if chainInfo := evm.GetChainInfo(networkOrRpcUrl); chainInfo != nil {
34-
url = chainInfo.DefaultUrl // if networkName is provided, use default URL
35-
} else {
36-
url = networkOrRpcUrl // if it's not a known network name, treat it as a URL
31+
func NewEVMFacilitator(network string, url string, privateKeyHex string) (*EVMFacilitator, error) {
32+
if network == "" && url == "" {
33+
return nil, fmt.Errorf("network or rpc url must be provided")
34+
} else if url == "" {
35+
// if url is not provided, use default URL
36+
if chainInfo := evm.GetChainInfo(network); chainInfo == nil {
37+
return nil, fmt.Errorf("unsupported network name: %s", network)
38+
} else {
39+
url = chainInfo.DefaultUrl
40+
}
3741
}
3842

3943
client, err := ethclient.Dial(url)
4044
if err != nil {
4145
return nil, fmt.Errorf("failed to connect to Ethereum client: %w", err)
4246
}
43-
4447
networkId, err := client.NetworkID(context.Background())
4548
if err != nil {
4649
return nil, fmt.Errorf("failed to get network ID: %w", err)
4750
}
48-
network := evm.GetChainName(networkId)
49-
if network == "" {
50-
return nil, fmt.Errorf("unsupported network ID: %s", networkId.String())
51+
chainName := evm.GetChainName(networkId)
52+
if chainName == "" || chainName != network {
53+
return nil, fmt.Errorf("unsupported network: %s", network)
5154
}
5255

5356
privateKey, err := hex.DecodeString(privateKeyHex)
@@ -143,7 +146,7 @@ func (t *EVMFacilitator) Verify(ctx context.Context, payload *types.PaymentPaylo
143146
if err != nil {
144147
return nil, err
145148
}
146-
if valid := evm.VerifySignature(pubkey, digest, sig); !valid {
149+
if valid := evm.VerifySignature(pubkey, digest, sig[:64]); !valid {
147150
return &types.PaymentVerifyResponse{
148151
IsValid: false,
149152
InvalidReason: types.ErrInvalidSignature.Error(),

facilitator/evm_test.go

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,45 @@ import (
1313
)
1414

1515
const (
16-
PrivateKey = ""
17-
X402Version = 1
18-
Network = "base-sepolia"
19-
Token = "USDC"
16+
PrivateKey = ""
17+
Network = "base-sepolia"
18+
Token = "USDC"
2019
)
2120

2221
func TestEVMVerify(t *testing.T) {
23-
facilitator, err := NewEVMFacilitator(Network, PrivateKey)
22+
facilitator, err := NewEVMFacilitator(Network, "", PrivateKey)
2423
require.NoError(t, err)
2524

26-
_ = facilitator
25+
privKey, err := hex.DecodeString("")
26+
require.NoError(t, err)
27+
evmPayload, err := evm.NewEVMPayload(Network, Token,
28+
"", "", big.NewInt(10000), evm.NewRawPrivateSigner(privKey))
29+
require.NoError(t, err)
30+
31+
evmPayloadJson, err := json.Marshal(evmPayload)
32+
require.NoError(t, err)
33+
34+
payload := &types.PaymentPayload{
35+
X402Version: int(types.X402VersionV1),
36+
Scheme: string(types.EVM),
37+
Network: Network,
38+
Payload: evmPayloadJson,
39+
}
40+
req := &types.PaymentRequirements{
41+
Scheme: string(types.EVM),
42+
Network: Network,
43+
Asset: Token,
44+
}
45+
46+
res, err := facilitator.Verify(t.Context(), payload, req)
47+
require.NoError(t, err)
48+
jsonRes, err := json.MarshalIndent(res, "", "\t")
49+
require.NoError(t, err)
50+
fmt.Println(string(jsonRes))
2751
}
2852

2953
func TestEVMSettle(t *testing.T) {
30-
facilitator, err := NewEVMFacilitator(Network, PrivateKey)
54+
facilitator, err := NewEVMFacilitator(Network, "", PrivateKey)
3155
require.NoError(t, err)
3256

3357
privKey, err := hex.DecodeString("")
@@ -38,10 +62,8 @@ func TestEVMSettle(t *testing.T) {
3862
evmPayloadJson, err := json.Marshal(evmPayload)
3963
require.NoError(t, err)
4064

41-
domainConfig := evm.GetDomainConfig(Network, Token)
42-
4365
payload := &types.PaymentPayload{
44-
X402Version: X402Version,
66+
X402Version: int(types.X402VersionV1),
4567
Scheme: string(types.EVM),
4668
Network: Network,
4769
Payload: evmPayloadJson,
@@ -50,7 +72,7 @@ func TestEVMSettle(t *testing.T) {
5072
req := &types.PaymentRequirements{
5173
Scheme: string(types.EVM),
5274
Network: Network,
53-
Asset: domainConfig.VerifyingContract.String(),
75+
Asset: Token,
5476
}
5577

5678
res, err := facilitator.Settle(t.Context(), payload, req)

facilitator/iface.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,16 @@ type Facilitator interface {
1313
Supported() []*types.SupportedKind
1414
}
1515

16-
func NewFacilitator(scheme types.Scheme, networkOrRpcUrl string, privateKeyHex string) (Facilitator, error) {
16+
func NewFacilitator(scheme types.Scheme, network, rpcUrl string, privateKeyHex string) (Facilitator, error) {
1717
switch scheme {
1818
case types.EVM:
19-
return NewEVMFacilitator(networkOrRpcUrl, privateKeyHex)
19+
return NewEVMFacilitator(network, rpcUrl, privateKeyHex)
2020
case types.Solana:
21-
return NewSolanaFacilitator(networkOrRpcUrl, privateKeyHex)
21+
return NewSolanaFacilitator(network, rpcUrl, privateKeyHex)
2222
case types.Sui:
23-
return NewSuiFacilitator(networkOrRpcUrl, privateKeyHex)
23+
return NewSuiFacilitator(network, rpcUrl, privateKeyHex)
2424
case types.Tron:
25-
return NewTronFacilitator(networkOrRpcUrl, privateKeyHex)
25+
return NewTronFacilitator(network, rpcUrl, privateKeyHex)
2626
default:
2727
return nil, fmt.Errorf("unsupporsed scheme: %s", scheme)
2828
}

facilitator/solana.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ type SolanaFacilitator struct {
1717
feePayer solTypes.Account
1818
}
1919

20-
func NewSolanaFacilitator(url string, privateKeyHex string) (*SolanaFacilitator, error) {
20+
func NewSolanaFacilitator(network string, url string, privateKeyHex string) (*SolanaFacilitator, error) {
2121
client := client.NewClient(url)
2222

2323
privKey, err := hex.DecodeString(privateKeyHex)

facilitator/sui.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99
type SuiFacilitator struct {
1010
}
1111

12-
func NewSuiFacilitator(url string, privateKeyHex string) (*SuiFacilitator, error) {
12+
func NewSuiFacilitator(network string, url string, privateKeyHex string) (*SuiFacilitator, error) {
1313
return &SuiFacilitator{}, nil
1414
}
1515

facilitator/tron.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99
type TronFacilitator struct {
1010
}
1111

12-
func NewTronFacilitator(url string, privateKeyHex string) (*TronFacilitator, error) {
12+
func NewTronFacilitator(network string, url string, privateKeyHex string) (*TronFacilitator, error) {
1313
return &TronFacilitator{}, nil
1414
}
1515

scheme/evm/crypto.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,10 @@ func sigToPub(hash, sig []byte) (*secp256k1.PublicKey, error) {
3434
}
3535
// Convert to secp256k1 input format with 'recovery id' v at the beginning.
3636
btcsig := make([]byte, SignatureLength)
37-
btcsig[0] = sig[RecoveryIDOffset] + 27
37+
btcsig[0] = sig[RecoveryIDOffset]
38+
if btcsig[0] < 27 {
39+
btcsig[0] += 27
40+
}
3841
copy(btcsig[1:], sig)
3942

4043
pub, _, err := decred_ecdsa.RecoverCompact(btcsig, hash)

types/scheme.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,9 @@ const (
88
Sui Scheme = "sui"
99
Tron Scheme = "tron"
1010
)
11+
12+
type X402Version int
13+
14+
const (
15+
X402VersionV1 X402Version = 1
16+
)

0 commit comments

Comments
 (0)