Skip to content

Commit a867523

Browse files
authored
Merge pull request #15 from mark3labs/fix/several-bug-fixes
Fix critical bugs in EVM signer and standardize examples
2 parents f000d57 + c3c73ad commit a867523

File tree

16 files changed

+555
-223
lines changed

16 files changed

+555
-223
lines changed

.beads/issues.jsonl

Lines changed: 2 additions & 0 deletions
Large diffs are not rendered by default.

examples/chi/main.go

Lines changed: 39 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ func main() {
2323
network := flag.String("network", "base-sepolia", "Network to accept payments on (base, base-sepolia, solana, solana-devnet)")
2424
payTo := flag.String("pay-to", "", "Address to receive payments (required)")
2525
tokenAddr := flag.String("token", "", "Token address (auto-detected based on network if not specified)")
26-
amount := flag.String("amount", "", "Payment amount in atomic units (default: 1000 = 0.001 USDC)")
26+
amount := flag.String("amount", "", "Payment amount in USDC (default: 0.001)")
2727
facilitatorURL := flag.String("facilitator", "https://facilitator.x402.rs", "Facilitator URL")
2828

2929
flag.Parse()
@@ -36,29 +36,43 @@ func main() {
3636
os.Exit(1)
3737
}
3838

39-
// Set defaults based on network if not specified
40-
if *tokenAddr == "" {
41-
switch strings.ToLower(*network) {
42-
case "solana":
43-
*tokenAddr = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" // USDC on Solana mainnet
44-
case "solana-devnet":
45-
*tokenAddr = "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU" // USDC on Solana devnet
46-
case "base", "base-sepolia":
47-
*tokenAddr = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913" // USDC on Base
48-
default:
49-
*tokenAddr = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913" // Default to Base USDC
50-
}
39+
// Get chain config based on network
40+
var chainConfig x402.ChainConfig
41+
switch strings.ToLower(*network) {
42+
case "solana":
43+
chainConfig = x402.SolanaMainnet
44+
case "solana-devnet":
45+
chainConfig = x402.SolanaDevnet
46+
case "base":
47+
chainConfig = x402.BaseMainnet
48+
case "base-sepolia":
49+
chainConfig = x402.BaseSepolia
50+
case "polygon":
51+
chainConfig = x402.PolygonMainnet
52+
case "polygon-amoy":
53+
chainConfig = x402.PolygonAmoy
54+
case "avalanche":
55+
chainConfig = x402.AvalancheMainnet
56+
case "avalanche-fuji":
57+
chainConfig = x402.AvalancheFuji
58+
default:
59+
chainConfig = x402.BaseSepolia // Default to Base Sepolia (safer for testing)
60+
}
61+
62+
// Override token address if provided
63+
if *tokenAddr != "" {
64+
chainConfig.USDCAddress = *tokenAddr
5165
}
5266

5367
if *amount == "" {
54-
*amount = "1000" // Default: 0.001 USDC (6 decimals)
68+
*amount = "0.001" // Default: 0.001 USDC
5569
}
5670

5771
fmt.Printf("Starting Chi server with x402 on port %s\n", *port)
5872
fmt.Printf("Network: %s\n", *network)
5973
fmt.Printf("Payment recipient: %s\n", *payTo)
60-
fmt.Printf("Payment amount: %s atomic units\n", *amount)
61-
fmt.Printf("Token: %s\n", *tokenAddr)
74+
fmt.Printf("Payment amount: %s USDC\n", *amount)
75+
fmt.Printf("Token: %s\n", chainConfig.USDCAddress)
6276
fmt.Printf("Facilitator: %s\n", *facilitatorURL)
6377
fmt.Println()
6478

@@ -71,14 +85,16 @@ func main() {
7185
r.Use(middleware.Logger)
7286
r.Use(middleware.Recoverer)
7387

74-
// Create payment requirement
75-
requirement := x402.PaymentRequirement{
76-
Scheme: "exact",
77-
Network: *network,
78-
MaxAmountRequired: *amount,
79-
Asset: *tokenAddr,
80-
PayTo: *payTo,
88+
// Create payment requirement using helper function
89+
requirement, err := x402.NewUSDCPaymentRequirement(x402.USDCRequirementConfig{
90+
Chain: chainConfig,
91+
Amount: *amount,
92+
RecipientAddress: *payTo,
93+
Description: "Access to paywalled content",
8194
MaxTimeoutSeconds: 60,
95+
})
96+
if err != nil {
97+
log.Fatalf("Failed to create payment requirement: %v", err)
8298
}
8399

84100
// Create x402 middleware config

examples/coinbase/go.mod

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,15 @@ require (
1111

1212
require (
1313
filippo.io/edwards25519 v1.1.0 // indirect
14+
github.com/benbjohnson/clock v1.3.5 // indirect
1415
github.com/blendle/zapdriver v1.3.1 // indirect
1516
github.com/davecgh/go-spew v1.1.1 // indirect
1617
github.com/fatih/color v1.18.0 // indirect
1718
github.com/gagliardetto/binary v0.8.0 // indirect
1819
github.com/gagliardetto/solana-go v1.14.0 // indirect
1920
github.com/gagliardetto/treeout v0.1.4 // indirect
2021
github.com/google/go-cmp v0.7.0 // indirect
22+
github.com/google/uuid v1.6.0 // indirect
2123
github.com/json-iterator/go v1.1.12 // indirect
2224
github.com/klauspost/compress v1.18.1 // indirect
2325
github.com/logrusorgru/aurora v2.0.3+incompatible // indirect
@@ -32,9 +34,11 @@ require (
3234
github.com/stretchr/testify v1.11.1 // indirect
3335
go.mongodb.org/mongo-driver v1.17.6 // indirect
3436
go.uber.org/multierr v1.11.0 // indirect
37+
go.uber.org/ratelimit v0.3.1 // indirect
3538
go.uber.org/zap v1.27.0 // indirect
3639
golang.org/x/crypto v0.43.0 // indirect
3740
golang.org/x/sys v0.37.0 // indirect
3841
golang.org/x/term v0.36.0 // indirect
42+
golang.org/x/time v0.14.0 // indirect
3943
gopkg.in/square/go-jose.v2 v2.6.0 // indirect
4044
)

examples/coinbase/go.sum

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
22
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
3+
github.com/AlekSi/pointer v1.1.0 h1:SSDMPcXD9jSl8FPy9cRzoRaMJtm9g9ggGTxecRUbQoI=
4+
github.com/AlekSi/pointer v1.1.0/go.mod h1:y7BvfRI3wXPWKXEBhU71nbnIEEZX0QTSB2Bj48UJIZE=
35
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
6+
github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o=
7+
github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
48
github.com/blendle/zapdriver v1.3.1 h1:C3dydBOWYRiOk+B8X9IVZ5IOe+7cl+tGOexN4QqHfpE=
59
github.com/blendle/zapdriver v1.3.1/go.mod h1:mdXfREi6u5MArG4j9fewC+FGnXaBR+T4Ox4J2u4eHCc=
610
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -10,13 +14,17 @@ github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
1014
github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
1115
github.com/gagliardetto/binary v0.8.0 h1:U9ahc45v9HW0d15LoN++vIXSJyqR/pWw8DDlhd7zvxg=
1216
github.com/gagliardetto/binary v0.8.0/go.mod h1:2tfj51g5o9dnvsc+fL3Jxr22MuWzYXwx9wEoN0XQ7/c=
17+
github.com/gagliardetto/gofuzz v1.2.2 h1:XL/8qDMzcgvR4+CyRQW9UGdwPRPMHVJfqQ/uMvSUuQw=
18+
github.com/gagliardetto/gofuzz v1.2.2/go.mod h1:bkH/3hYLZrMLbfYWA0pWzXmi5TTRZnu4pMGZBkqMKvY=
1319
github.com/gagliardetto/solana-go v1.14.0 h1:3WfAi70jOOjAJ0deFMjdhFYlLXATF4tOQXsDNWJtOLw=
1420
github.com/gagliardetto/solana-go v1.14.0/go.mod h1:l/qqqIN6qJJPtxW/G1PF4JtcE3Zg2vD2EliZrr9Gn5k=
1521
github.com/gagliardetto/treeout v0.1.4 h1:ozeYerrLCmCubo1TcIjFiOWTTGteOOHND1twdFpgwaw=
1622
github.com/gagliardetto/treeout v0.1.4/go.mod h1:loUefvXTrlRG5rYmJmExNryyBRh8f89VZhmMOyCyqok=
1723
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
1824
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
1925
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
26+
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
27+
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
2028
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
2129
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
2230
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
@@ -45,6 +53,8 @@ github.com/mostynb/zstdpool-freelist v0.0.0-20201229113212-927304c0c3b1 h1:mPMvm
4553
github.com/mostynb/zstdpool-freelist v0.0.0-20201229113212-927304c0c3b1/go.mod h1:ye2e/VUEtE2BHE+G/QcKkcLQVAEJoYRFj5VUOQatCRE=
4654
github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o=
4755
github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
56+
github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE=
57+
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
4858
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
4959
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
5060
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
@@ -65,13 +75,17 @@ go.mongodb.org/mongo-driver v1.17.6 h1:87JUG1wZfWsr6rIz3ZmpH90rL5tea7O3IHuSwHUps
6575
go.mongodb.org/mongo-driver v1.17.6/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ=
6676
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
6777
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
78+
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
79+
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
6880
go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
6981
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
7082
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
7183
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
7284
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
7385
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
7486
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
87+
go.uber.org/ratelimit v0.3.1 h1:K4qVE+byfv/B3tC+4nYWP7v/6SimcO7HzHekoMNBma0=
88+
go.uber.org/ratelimit v0.3.1/go.mod h1:6euWsTB6U/Nb3X++xEUXA8ciPJvr19Q/0h1+oDcJhRk=
7589
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
7690
go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw=
7791
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
@@ -88,6 +102,8 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
88102
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
89103
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
90104
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
105+
golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4=
106+
golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210=
91107
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
92108
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
93109
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -106,18 +122,24 @@ golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss=
106122
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
107123
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
108124
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
125+
golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k=
126+
golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM=
127+
golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI=
128+
golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4=
109129
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
110130
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
111131
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
112132
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
113133
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
114134
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
135+
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
115136
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
116137
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
117138
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
118139
gopkg.in/square/go-jose.v2 v2.6.0 h1:NGk74WTnPKBNUhNzQX7PYcTLUjoq7mzKk2OKbvwk2iI=
119140
gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
120141
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
142+
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
121143
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
122144
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
123145
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

examples/coinbase/main.go

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ func runServer(args []string) {
5555
network := fs.String("network", "base-sepolia", "Network to accept payments on (base, base-sepolia, ethereum, ethereum-sepolia, polygon)")
5656
payTo := fs.String("pay-to", "", "Address to receive payments (required)")
5757
tokenAddr := fs.String("token", "", "Token address (auto-detected based on network if not specified)")
58-
amount := fs.String("amount", "", "Payment amount in atomic units (default: 1000 = 0.001 USDC)")
58+
amount := fs.String("amount", "", "Payment amount in USDC (default: 0.001)")
5959
facilitatorURL := fs.String("facilitator", "https://facilitator.x402.rs", "Facilitator URL")
6060
verbose := fs.Bool("verbose", false, "Enable verbose debug output")
6161

@@ -92,34 +92,36 @@ func runServer(args []string) {
9292
log.Fatalf("Unsupported network: %s", *network)
9393
}
9494

95-
// Use token address from config if not specified
96-
if *tokenAddr == "" {
97-
*tokenAddr = chainConfig.USDCAddress
95+
// Override token address if provided
96+
if *tokenAddr != "" {
97+
chainConfig.USDCAddress = *tokenAddr
9898
}
9999

100100
if *amount == "" {
101-
*amount = "1000" // Default: 0.001 USDC (6 decimals)
101+
*amount = "0.001" // Default: 0.001 USDC
102102
}
103103

104104
fmt.Printf("Starting Coinbase CDP x402 demo server on port %s\n", *port)
105105
fmt.Printf("Network: %s\n", *network)
106106
fmt.Printf("Payment recipient: %s\n", *payTo)
107-
fmt.Printf("Payment amount: %s atomic units\n", *amount)
108-
fmt.Printf("Token: %s\n", *tokenAddr)
107+
fmt.Printf("Payment amount: %s USDC\n", *amount)
108+
fmt.Printf("Token: %s\n", chainConfig.USDCAddress)
109109
fmt.Printf("Facilitator: %s\n", *facilitatorURL)
110110
if *verbose {
111111
fmt.Printf("Verbose mode: ENABLED\n")
112112
}
113113
fmt.Println()
114114

115-
// Create payment requirements
116-
requirement := x402.PaymentRequirement{
117-
Scheme: "exact",
118-
Network: *network,
119-
MaxAmountRequired: *amount,
120-
Asset: *tokenAddr,
121-
PayTo: *payTo,
115+
// Create payment requirement using helper function
116+
requirement, err := x402.NewUSDCPaymentRequirement(x402.USDCRequirementConfig{
117+
Chain: chainConfig,
118+
Amount: *amount,
119+
RecipientAddress: *payTo,
120+
Description: "Access to paywalled content",
122121
MaxTimeoutSeconds: 60,
122+
})
123+
if err != nil {
124+
log.Fatalf("Failed to create payment requirement: %v", err)
123125
}
124126

125127
requirements := []x402.PaymentRequirement{requirement}

examples/gin/README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -280,10 +280,10 @@ func handler(c *gin.Context) {
280280
### Network Detection
281281

282282
Token addresses are auto-detected based on network:
283-
- `base`: `0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913` (USDC)
284-
- `base-sepolia`: `0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913` (USDC)
285-
- `solana`: `EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v` (USDC)
286-
- `solana-devnet`: `4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU` (USDC)
283+
- `base`: `0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913` (USDC mainnet)
284+
- `base-sepolia`: `0x036CbD53842c5426634e7929541eC2318f3dCF7e` (USDC testnet)
285+
- `solana`: `EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v` (USDC mainnet)
286+
- `solana-devnet`: `4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU` (USDC testnet)
287287

288288
### Payment Amounts
289289

0 commit comments

Comments
 (0)