Skip to content

Commit db10a57

Browse files
authored
Merge pull request #21 from sudo-robi/issue-4.1-connect-freighter-wallet
Issue 4.1 connect freighter wallet
2 parents 260d754 + 4ddd454 commit db10a57

10 files changed

Lines changed: 5340 additions & 492 deletions

File tree

contracts/src/lib.rs

Lines changed: 947 additions & 350 deletions
Large diffs are not rendered by default.

contracts/test_snapshots/test/test_deposit_withdraw.1.json

Lines changed: 37 additions & 140 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,24 @@
11
{
22
"generators": {
3-
"address": 3,
3+
"address": 4,
44
"nonce": 0
55
},
66
"auth": [
77
[],
88
[
99
[
10-
"CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
10+
"CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
1111
{
1212
"function": {
1313
"contract_fn": {
14-
"contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
14+
"contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4",
1515
"function_name": "initialize",
1616
"args": [
1717
{
18-
"address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
18+
"address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4"
19+
},
20+
{
21+
"address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM"
1922
}
2023
]
2124
}
@@ -26,15 +29,15 @@
2629
],
2730
[
2831
[
29-
"CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4",
32+
"CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
3033
{
3134
"function": {
3235
"contract_fn": {
33-
"contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
36+
"contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4",
3437
"function_name": "deposit",
3538
"args": [
3639
{
37-
"address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
40+
"address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
3841
},
3942
{
4043
"i128": {
@@ -46,10 +49,10 @@
4649
"u32": 60
4750
},
4851
{
49-
"u32": 30
52+
"u32": 0
5053
},
5154
{
52-
"u32": 10
55+
"u32": 0
5356
}
5457
]
5558
}
@@ -63,133 +66,24 @@
6366
[],
6467
[
6568
[
66-
"CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4",
69+
"CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
6770
{
68-
"function": {
69-
"contract_fn": {
70-
"contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
71-
"function_name": "withdraw",
72-
"args": [
73-
{
74-
"address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
75-
},
76-
{
77-
"i128": {
78-
"hi": 0,
79-
"lo": 500
80-
}
81-
}
82-
]
71+
"contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4",
72+
"key": "ledger_key_contract_instance",
73+
"durability": "persistent"
8374
}
8475
},
85-
"sub_invocations": []
86-
}
87-
]
88-
],
89-
[]
90-
],
91-
"ledger": {
92-
"protocol_version": 22,
93-
"sequence_number": 0,
94-
"timestamp": 0,
95-
"network_id": "0000000000000000000000000000000000000000000000000000000000000000",
96-
"base_reserve": 0,
97-
"min_persistent_entry_ttl": 4096,
98-
"min_temp_entry_ttl": 16,
99-
"max_entry_ttl": 6312000,
100-
"ledger_entries": [
101-
[
102-
{
103-
"contract_data": {
104-
"contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
105-
"key": {
106-
"vec": [
107-
{
108-
"symbol": "Admin"
109-
}
110-
]
111-
},
112-
"durability": "persistent"
113-
}
114-
},
115-
[
116-
{
117-
"last_modified_ledger_seq": 0,
118-
"data": {
119-
"contract_data": {
120-
"ext": "v0",
121-
"contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
122-
"key": {
123-
"vec": [
124-
{
125-
"symbol": "Admin"
126-
}
127-
]
128-
},
129-
"durability": "persistent",
130-
"val": {
131-
"address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M"
132-
}
133-
}
134-
},
135-
"ext": "v0"
136-
},
137-
4095
138-
]
139-
],
140-
[
141-
{
142-
"contract_data": {
143-
"contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
144-
"key": {
145-
"vec": [
146-
{
147-
"symbol": "UserBalance"
148-
},
149-
{
150-
"address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
151-
}
152-
]
153-
},
154-
"durability": "persistent"
155-
}
156-
},
157-
[
158-
{
159-
"last_modified_ledger_seq": 0,
160-
"data": {
161-
"contract_data": {
162-
"ext": "v0",
163-
"contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
164-
"key": {
165-
"vec": [
166-
{
167-
"symbol": "UserBalance"
168-
},
169-
{
170-
"address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4"
171-
}
172-
]
173-
},
174-
"durability": "persistent",
175-
"val": {
176-
"i128": {
177-
"hi": 0,
178-
"lo": 500
179-
}
180-
}
181-
}
182-
},
183-
"ext": "v0"
184-
},
185-
4095
186-
]
187-
],
188-
[
189-
{
190-
"contract_data": {
191-
"contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
192-
"key": {
76+
[
77+
{
78+
"last_modified_ledger_seq": 0,
79+
"data": {
80+
"contract_data": {
81+
"ext": "v0",
82+
"contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4",
83+
"key": "ledger_key_contract_instance",
84+
"durability": "persistent",
85+
"val": {
86+
"contract_instance": {
19387
"vec": [
19488
{
19589
"symbol": "UserBlendBalance"
@@ -333,6 +227,9 @@
333227
{
334228
"contract_data": {
335229
"contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
230+
=======
231+
"contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4",
232+
>>>>>>> fc31c44 (feat: Connect Freighter Wallet integration (Issue 4.1))
336233
"key": "ledger_key_contract_instance",
337234
"durability": "persistent"
338235
}
@@ -343,7 +240,7 @@
343240
"data": {
344241
"contract_data": {
345242
"ext": "v0",
346-
"contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM",
243+
"contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4",
347244
"key": "ledger_key_contract_instance",
348245
"durability": "persistent",
349246
"val": {
@@ -364,7 +261,7 @@
364261
[
365262
{
366263
"contract_data": {
367-
"contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4",
264+
"contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
368265
"key": {
369266
"ledger_key_nonce": {
370267
"nonce": 1033654523790656264
@@ -379,7 +276,7 @@
379276
"data": {
380277
"contract_data": {
381278
"ext": "v0",
382-
"contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4",
279+
"contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
383280
"key": {
384281
"ledger_key_nonce": {
385282
"nonce": 1033654523790656264
@@ -397,7 +294,7 @@
397294
[
398295
{
399296
"contract_data": {
400-
"contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4",
297+
"contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
401298
"key": {
402299
"ledger_key_nonce": {
403300
"nonce": 5541220902715666415
@@ -412,7 +309,7 @@
412309
"data": {
413310
"contract_data": {
414311
"ext": "v0",
415-
"contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCT4",
312+
"contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
416313
"key": {
417314
"ledger_key_nonce": {
418315
"nonce": 5541220902715666415
@@ -430,7 +327,7 @@
430327
[
431328
{
432329
"contract_data": {
433-
"contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
330+
"contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
434331
"key": {
435332
"ledger_key_nonce": {
436333
"nonce": 801925984706572462
@@ -445,7 +342,7 @@
445342
"data": {
446343
"contract_data": {
447344
"ext": "v0",
448-
"contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M",
345+
"contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4",
449346
"key": {
450347
"ledger_key_nonce": {
451348
"nonce": 801925984706572462
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import React from 'react';
2+
3+
export interface ConnectWalletButtonProps {
4+
onClick: () => void;
5+
publicKey?: string;
6+
}
7+
8+
function truncatePublicKey(key: string) {
9+
if (!key) return '';
10+
return key.slice(0, 4) + '...' + key.slice(-4);
11+
}
12+
13+
export const ConnectWalletButton: React.FC<ConnectWalletButtonProps> = ({ onClick, publicKey }) => {
14+
return (
15+
<button onClick={onClick} className="connect-wallet-btn">
16+
{publicKey ? truncatePublicKey(publicKey) : 'Connect Wallet'}
17+
</button>
18+
);
19+
};
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import React from 'react';
2+
3+
export const DashboardHeader: React.FC<{ children?: React.ReactNode }> = ({ children }) => (
4+
<header className="dashboard-header" style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', padding: '1rem 2rem', borderBottom: '1px solid #eee' }}>
5+
<div style={{ fontWeight: 700, fontSize: '1.5rem' }}>Smasage</div>
6+
<div>{children}</div>
7+
</header>
8+
);
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
"use client";
2+
import { createContext, useContext, useState, ReactNode } from 'react';
3+
4+
interface WalletContextType {
5+
publicKey: string | null;
6+
setPublicKey: (key: string | null) => void;
7+
}
8+
9+
const WalletContext = createContext<WalletContextType | undefined>(undefined);
10+
11+
export const WalletProvider = ({ children }: { children: ReactNode }) => {
12+
const [publicKey, setPublicKey] = useState<string | null>(null);
13+
return (
14+
<WalletContext.Provider value={{ publicKey, setPublicKey }}>
15+
{children}
16+
</WalletContext.Provider>
17+
);
18+
};
19+
20+
export const useWallet = () => {
21+
const ctx = useContext(WalletContext);
22+
if (!ctx) throw new Error('useWallet must be used within WalletProvider');
23+
return ctx;
24+
};

frontend/src/app/layout.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
12
import type { Metadata } from 'next';
23
import './globals.css';
4+
import { WalletProvider } from './components/WalletContext';
35

46
export const metadata: Metadata = {
57
title: 'Smasage | AI Portfolio Manager',
@@ -16,7 +18,9 @@ export default function RootLayout({
1618
<head>
1719
<link href="https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700&display=swap" rel="stylesheet" />
1820
</head>
19-
<body>{children}</body>
21+
<body>
22+
<WalletProvider>{children}</WalletProvider>
23+
</body>
2024
</html>
2125
);
2226
}

0 commit comments

Comments
 (0)