Skip to content

Commit d4a6201

Browse files
authored
Fusion refactor limit order v4 (#100)
1 parent a2a1e97 commit d4a6201

File tree

18 files changed

+1880
-442
lines changed

18 files changed

+1880
-442
lines changed
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"log"
7+
"math/big"
8+
"os"
9+
"time"
10+
11+
"github.com/1inch/1inch-sdk-go/constants"
12+
"github.com/1inch/1inch-sdk-go/sdk-clients/aggregation"
13+
"github.com/ethereum/go-ethereum/common"
14+
"github.com/ethereum/go-ethereum/common/hexutil"
15+
)
16+
17+
var (
18+
privateKey = os.Getenv("WALLET_KEY")
19+
nodeUrl = os.Getenv("NODE_URL")
20+
devPortalToken = os.Getenv("DEV_PORTAL_TOKEN")
21+
)
22+
23+
const (
24+
UsdcBase = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
25+
WethBase = "0x4200000000000000000000000000000000000006"
26+
amountUsdc = "100000" // 0.1 USDC (6 decimals)
27+
)
28+
29+
func main() {
30+
config, err := aggregation.NewConfiguration(aggregation.ConfigurationParams{
31+
NodeUrl: nodeUrl,
32+
PrivateKey: privateKey,
33+
ChainId: constants.BaseChainId,
34+
ApiUrl: "https://api.1inch.dev",
35+
ApiKey: devPortalToken,
36+
})
37+
if err != nil {
38+
log.Fatalf("Failed to create configuration: %v\n", err)
39+
}
40+
client, err := aggregation.NewClient(config)
41+
if err != nil {
42+
log.Fatalf("Failed to create client: %v\n", err)
43+
}
44+
ctx := context.Background()
45+
46+
walletAddr := client.Wallet.Address().Hex()
47+
48+
// Step 1: Check Allowance
49+
allowanceData, err := client.GetApproveAllowance(ctx, aggregation.GetAllowanceParams{
50+
TokenAddress: UsdcBase,
51+
WalletAddress: walletAddr,
52+
})
53+
if err != nil {
54+
log.Fatalf("Failed to get allowance: %v\n", err)
55+
}
56+
allowance := new(big.Int)
57+
allowance.SetString(allowanceData.Allowance, 10)
58+
59+
amountToSwap := new(big.Int)
60+
amountToSwap.SetString(amountUsdc, 10)
61+
62+
// Step 2: Approve if needed
63+
if allowance.Cmp(amountToSwap) < 0 {
64+
fmt.Println("Insufficient allowance. Approving...")
65+
approveData, err := client.GetApproveTransaction(ctx, aggregation.GetApproveParams{
66+
TokenAddress: UsdcBase,
67+
Amount: amountUsdc,
68+
})
69+
if err != nil {
70+
log.Fatalf("Failed to get approve data: %v\n", err)
71+
}
72+
data, err := hexutil.Decode(approveData.Data)
73+
if err != nil {
74+
log.Fatalf("Failed to decode approve data: %v\n", err)
75+
}
76+
to := common.HexToAddress(approveData.To)
77+
78+
tx, err := client.TxBuilder.New().SetData(data).SetTo(&to).Build(ctx)
79+
if err != nil {
80+
log.Fatalf("Failed to build approve transaction: %v\n", err)
81+
}
82+
signedTx, err := client.Wallet.Sign(tx)
83+
if err != nil {
84+
log.Fatalf("Failed to sign approve transaction: %v\n", err)
85+
}
86+
err = client.Wallet.BroadcastTransaction(ctx, signedTx)
87+
if err != nil {
88+
log.Fatalf("Failed to broadcast approve transaction: %v\n", err)
89+
}
90+
91+
fmt.Printf("Approve transaction sent: https://basescan.org/tx/%s\n", signedTx.Hash().Hex())
92+
93+
// Wait for approval to be mined
94+
for {
95+
receipt, _ := client.Wallet.TransactionReceipt(ctx, signedTx.Hash())
96+
if receipt != nil {
97+
fmt.Println("Approve transaction confirmed.")
98+
break
99+
}
100+
time.Sleep(2 * time.Second)
101+
}
102+
} else {
103+
fmt.Println("Sufficient allowance already present.")
104+
}
105+
106+
// Step 3: Perform Swap
107+
swapData, err := client.GetSwap(ctx, aggregation.GetSwapParams{
108+
Src: UsdcBase,
109+
Dst: WethBase,
110+
Amount: amountUsdc,
111+
From: walletAddr,
112+
Slippage: 1, // 1% slippage
113+
})
114+
if err != nil {
115+
log.Fatalf("Failed to get swap data: %v\n", err)
116+
}
117+
118+
tx, err := client.TxBuilder.New().
119+
SetData(swapData.TxNormalized.Data).
120+
SetTo(&swapData.TxNormalized.To).
121+
SetGas(swapData.TxNormalized.Gas).
122+
SetValue(swapData.TxNormalized.Value).
123+
Build(ctx)
124+
if err != nil {
125+
log.Fatalf("Failed to build transaction: %v\n", err)
126+
}
127+
signedTx, err := client.Wallet.Sign(tx)
128+
if err != nil {
129+
log.Fatalf("Failed to sign transaction: %v\n", err)
130+
}
131+
132+
err = client.Wallet.BroadcastTransaction(ctx, signedTx)
133+
if err != nil {
134+
log.Fatalf("Failed to broadcast transaction: %v\n", err)
135+
}
136+
137+
fmt.Printf("Swap transaction sent: https://basescan.org/tx/%s\n", signedTx.Hash().Hex())
138+
139+
// Wait for swap transaction to be mined
140+
for {
141+
receipt, _ := client.Wallet.TransactionReceipt(ctx, signedTx.Hash())
142+
if receipt != nil {
143+
fmt.Println("Swap transaction confirmed!")
144+
break
145+
}
146+
time.Sleep(2 * time.Second)
147+
}
148+
}

sdk-clients/aggregation/examples/swap/main.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,17 @@ var (
2424
)
2525

2626
const (
27-
PolygonPol = "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"
28-
PolygonUsdc = "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359"
29-
amountPol = "1000000000000000000"
30-
amountUsdc = "100000"
27+
UsdcBase = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
28+
WethBase = "0x4200000000000000000000000000000000000006"
29+
amountWeth = "10000000000000000"
30+
amountUsdc = "100000"
3131
)
3232

3333
func main() {
3434
config, err := aggregation.NewConfiguration(aggregation.ConfigurationParams{
3535
NodeUrl: nodeUrl,
3636
PrivateKey: privateKey,
37-
ChainId: constants.PolygonChainId,
37+
ChainId: constants.BaseChainId,
3838
ApiUrl: "https://api.1inch.dev",
3939
ApiKey: devPortalToken,
4040
})
@@ -48,8 +48,8 @@ func main() {
4848
ctx := context.Background()
4949

5050
swapData, err := client.GetSwap(ctx, aggregation.GetSwapParams{
51-
Src: PolygonUsdc,
52-
Dst: PolygonPol,
51+
Src: UsdcBase,
52+
Dst: WethBase,
5353
Amount: amountUsdc,
5454
From: client.Wallet.Address().Hex(),
5555
Slippage: 1,

sdk-clients/orderbook/api.go

Lines changed: 36 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212

1313
// CreateOrder creates an order in the Limit Order Protocol
1414
func (api *api) CreateOrder(ctx context.Context, params CreateOrderParams) (*CreateOrderResponse, error) {
15-
u := fmt.Sprintf("/orderbook/v4.0/%d", api.chainId)
15+
u := fmt.Sprintf("/orderbook/v4.1/%d", api.chainId)
1616

1717
err := params.Validate()
1818
if err != nil {
@@ -49,8 +49,6 @@ func (api *api) CreateOrder(ctx context.Context, params CreateOrderParams) (*Cre
4949
return &createOrderResponse, nil
5050
}
5151

52-
// TODO Reusing the same request/response objects until the openapi spec is updated to include the correct object definitions
53-
5452
// GetOrdersByCreatorAddress returns all orders created by a given address in the Limit Order Protocol
5553
func (api *api) GetOrdersByCreatorAddress(ctx context.Context, params GetOrdersByCreatorAddressParams) ([]*OrderResponse, error) {
5654
u := fmt.Sprintf("/orderbook/v4.0/%d/address/%s", api.chainId, params.CreatorAddress)
@@ -77,7 +75,7 @@ func (api *api) GetOrdersByCreatorAddress(ctx context.Context, params GetOrdersB
7775

7876
// GetOrder returns an order from Limit Order Protocol that matches a specific hash
7977
func (api *api) GetOrder(ctx context.Context, params GetOrderParams) (*GetOrderByHashResponseExtended, error) {
80-
u := fmt.Sprintf("/orderbook/v4.0/%d/order/%s", api.chainId, params.OrderHash)
78+
u := fmt.Sprintf("/orderbook/v4.1/%d/order/%s", api.chainId, params.OrderHash)
8179

8280
err := params.Validate()
8381
if err != nil {
@@ -99,6 +97,30 @@ func (api *api) GetOrder(ctx context.Context, params GetOrderParams) (*GetOrderB
9997
return NormalizeGetOrderByHashResponse(getOrderByHashResponse)
10098
}
10199

100+
// GetOrderCount returns the number of orders for a given trading pair with a specific status
101+
func (api *api) GetOrderCount(ctx context.Context, params GetOrderCountParams) (*GetOrderCountResponse, error) {
102+
u := fmt.Sprintf("/orderbook/v4.1/%d/count", api.chainId)
103+
104+
err := params.Validate()
105+
if err != nil {
106+
return nil, err
107+
}
108+
109+
payload := common.RequestPayload{
110+
Method: "GET",
111+
Params: params,
112+
U: u,
113+
}
114+
115+
var response GetOrderCountResponse
116+
err = api.httpExecutor.ExecuteRequest(ctx, payload, &response)
117+
if err != nil {
118+
return nil, err
119+
}
120+
121+
return &response, nil
122+
}
123+
102124
// GetOrderWithSignature first looks up an order by hash, then does a second request to get the signature data
103125
func (api *api) GetOrderWithSignature(ctx context.Context, params GetOrderParams) (*OrderExtendedWithSignature, error) {
104126

@@ -115,7 +137,7 @@ func (api *api) GetOrderWithSignature(ctx context.Context, params GetOrderParams
115137

116138
// Second, lookup all orders by that creator (these orders will contain the signature data)
117139
allOrdersByCreator, err := api.GetOrdersByCreatorAddress(ctx, GetOrdersByCreatorAddressParams{
118-
CreatorAddress: order.OrderMaker,
140+
CreatorAddress: order.Data.Maker,
119141
})
120142
if err != nil {
121143
return nil, err
@@ -136,8 +158,8 @@ func (api *api) GetOrderWithSignature(ctx context.Context, params GetOrderParams
136158
}
137159

138160
// GetAllOrders returns all orders in the Limit Order Protocol
139-
func (api *api) GetAllOrders(ctx context.Context, params GetAllOrdersParams) ([]OrderResponse, error) {
140-
u := fmt.Sprintf("/orderbook/v3.0/%d/all", api.chainId)
161+
func (api *api) GetAllOrders(ctx context.Context, params GetAllOrdersParams) (*Orders, error) {
162+
u := fmt.Sprintf("/orderbook/v4.1/%d/all", api.chainId)
141163

142164
err := params.Validate()
143165
if err != nil {
@@ -150,92 +172,17 @@ func (api *api) GetAllOrders(ctx context.Context, params GetAllOrdersParams) ([]
150172
U: u,
151173
}
152174

153-
var allOrdersResponse []OrderResponse
175+
var allOrdersResponse Orders
154176
err = api.httpExecutor.ExecuteRequest(ctx, payload, &allOrdersResponse)
155177
if err != nil {
156178
return nil, err
157179
}
158180

159-
return allOrdersResponse, nil
160-
}
161-
162-
// GetCount returns the number of orders in the Limit Order Protocol
163-
func (api *api) GetCount(ctx context.Context, params GetCountParams) (*CountResponse, error) {
164-
u := fmt.Sprintf("/orderbook/v3.0/%d/count", api.chainId)
165-
166-
err := params.Validate()
167-
if err != nil {
168-
return nil, err
169-
}
170-
171-
payload := common.RequestPayload{
172-
Method: "GET",
173-
Params: params,
174-
U: u,
175-
}
176-
177-
var count CountResponse
178-
err = api.httpExecutor.ExecuteRequest(ctx, payload, &count)
179-
if err != nil {
180-
return nil, err
181-
}
182-
183-
return &count, nil
181+
return &allOrdersResponse, nil
184182
}
185183

186-
// GetEvent returns an event in the Limit Order Protocol by order hash
187-
func (api *api) GetEvent(ctx context.Context, params GetEventParams) (*EventResponse, error) {
188-
u := fmt.Sprintf("/orderbook/v3.0/%d/events/%s", api.chainId, params.OrderHash)
189-
190-
err := params.Validate()
191-
if err != nil {
192-
return nil, err
193-
}
194-
195-
payload := common.RequestPayload{
196-
Method: "GET",
197-
Params: params,
198-
U: u,
199-
}
200-
201-
var event EventResponse
202-
err = api.httpExecutor.ExecuteRequest(ctx, payload, &event)
203-
if err != nil {
204-
return nil, err
205-
}
206-
207-
return &event, nil
208-
}
209-
210-
// GetEvents returns all events in the Limit Order Protocol
211-
func (api *api) GetEvents(ctx context.Context, params GetEventsParams) ([]EventResponse, error) {
212-
u := fmt.Sprintf("/orderbook/v3.0/%d/events", api.chainId)
213-
214-
err := params.Validate()
215-
if err != nil {
216-
return nil, err
217-
}
218-
219-
payload := common.RequestPayload{
220-
Method: "GET",
221-
Params: params,
222-
U: u,
223-
}
224-
225-
var events []EventResponse
226-
err = api.httpExecutor.ExecuteRequest(ctx, payload, &events)
227-
if err != nil {
228-
return nil, err
229-
}
230-
231-
return events, nil
232-
}
233-
234-
// TODO untested endpoint
235-
236-
// GetActiveOrdersWithPermit returns all orders in the Limit Order Protocol that are active and have a valid permit
237-
func (api *api) GetActiveOrdersWithPermit(ctx context.Context, params GetActiveOrdersWithPermitParams) ([]OrderResponse, error) {
238-
u := fmt.Sprintf("/orderbook/v3.0/%d/has-active-orders-with-permit/%s/%s", api.chainId, params.Token, params.Wallet)
184+
func (api *api) GetFeeInfo(ctx context.Context, params GetFeeInfoParams) (*FeeInfoResponse, error) {
185+
u := fmt.Sprintf("/orderbook/v4.0/%d/fee-info", api.chainId)
239186

240187
err := params.Validate()
241188
if err != nil {
@@ -248,11 +195,11 @@ func (api *api) GetActiveOrdersWithPermit(ctx context.Context, params GetActiveO
248195
U: u,
249196
}
250197

251-
var orders []OrderResponse
252-
err = api.httpExecutor.ExecuteRequest(ctx, payload, &orders)
198+
var feeInfo *FeeInfoResponse
199+
err = api.httpExecutor.ExecuteRequest(ctx, payload, &feeInfo)
253200
if err != nil {
254201
return nil, err
255202
}
256203

257-
return orders, nil
204+
return feeInfo, nil
258205
}

0 commit comments

Comments
 (0)