Skip to content

Commit 3b1a85b

Browse files
committed
upd wibe3
1 parent 8583345 commit 3b1a85b

File tree

9 files changed

+647
-61
lines changed

9 files changed

+647
-61
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ build
1010
.vite
1111
example/public
1212
dist
13+
.env
1314

1415
node_modules
1516
dist-ssr

example/src/Wibe.tsx

Lines changed: 62 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,37 @@ import { OmniToken, Wibe3Wallet } from "../../wibe3/src";
55
const wibe3 = new Wibe3Client();
66

77
const wallet = new Wibe3Wallet({
8-
privateKey: "ed25519:4J1Svjdiy71rRyRL84zq9aPDUHdDjieWLhF1vBYt5XFWZwDpQoRxEhq48PfqtRAuPZ9d9EoPcy1k3UHtg76i79s5",
8+
privateKey: process.env.PRIVATE_KEY!,
99
});
1010

1111
export const Wibe = () => {
12-
const { address, tradingAddress, withdraw, connect, auth, disconnect } = useWibe3(wibe3);
12+
const { address, tradingAddress, withdraw, connect, auth, disconnect, refresh } = useWibe3(wibe3);
1313
const [jwt, setJwt] = useState<string | null>(null);
1414

1515
const authWallet = async () => {
1616
const signed = await auth();
17-
1817
const isValid = await wallet.validateAuth(signed);
1918
if (!isValid) throw new Error("Invalid auth");
20-
2119
setJwt("jwt");
2220
};
2321

2422
const claim = async () => {
25-
if (!tradingAddress) throw new Error("Trading address not found");
26-
await wallet.transfer({ token: OmniToken.USDT, amount: 0.01, to: tradingAddress, paymentId: "claim" });
23+
try {
24+
if (!tradingAddress) throw new Error("Trading address not found");
25+
await wallet.transfer({ token: OmniToken.USDT, amount: 0.01, to: tradingAddress, paymentId: "claim" });
26+
} catch (e) {
27+
alert(e);
28+
}
29+
};
30+
31+
const withdrawToken = async () => {
32+
try {
33+
await withdraw(OmniToken.USDT, 0.01);
34+
await refresh().catch(() => {});
35+
alert("Withdraw successful");
36+
} catch (e) {
37+
alert(e);
38+
}
2739
};
2840

2941
if (!address) {
@@ -37,7 +49,8 @@ export const Wibe = () => {
3749
if (!jwt) {
3850
return (
3951
<div>
40-
<p>Address: {address}</p>
52+
<Balances />
53+
4154
<button onClick={() => authWallet()}>Auth</button>
4255
<button onClick={() => disconnect()}>Disconnect</button>
4356
</div>
@@ -46,10 +59,50 @@ export const Wibe = () => {
4659

4760
return (
4861
<div>
49-
<p>Address: {address}</p>
62+
<Balances />
63+
5064
<button onClick={() => claim()}>Claim 0.01$</button>
51-
<button onClick={() => withdraw()}>Withdraw</button>
65+
<button onClick={() => withdraw(OmniToken.USDT, 0.01)}>Withdraw USDT</button>
5266
<button onClick={() => disconnect()}>Disconnect</button>
5367
</div>
5468
);
5569
};
70+
71+
const Balances = () => {
72+
const { balances, address } = useWibe3(wibe3);
73+
74+
if (!address) return null;
75+
76+
return (
77+
<div>
78+
<p style={{ margin: 0 }}>Address: {address}</p>
79+
<p style={{ margin: 0 }}>Balances:</p>
80+
81+
{balances.map((balance) => (
82+
<div key={balance.symbol} style={styles.balance}>
83+
<img
84+
style={{ width: 24, height: 24, borderRadius: "50%", objectFit: "cover" }}
85+
src={balance.icon}
86+
alt={balance.symbol}
87+
/>
88+
<p style={{ margin: 0 }}>
89+
{balance.float} {balance.symbol}
90+
</p>
91+
</div>
92+
))}
93+
</div>
94+
);
95+
};
96+
97+
const styles = {
98+
balance: {
99+
display: "flex",
100+
alignItems: "center",
101+
gap: 8,
102+
border: "1px solid #bebebe",
103+
padding: 8,
104+
borderRadius: 16,
105+
width: "fit-content",
106+
marginBottom: 8,
107+
},
108+
};

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@hot-labs/near-connect",
3-
"version": "0.6.4",
3+
"version": "0.6.5",
44
"type": "commonjs",
55
"main": "./build/index.js",
66
"types": "./build/index.d.ts",
@@ -20,7 +20,7 @@
2020
"modal-ui.css"
2121
],
2222
"scripts": {
23-
"build": "yarn tsc",
23+
"build": "rm -rf build && yarn tsc",
2424
"cdn": "yarn vite build",
2525
"example": "cd example && yarn start",
2626
"build:example": "cd example && yarn build",

src/Intents.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ class Intents {
8484
return assets;
8585
}
8686

87-
async viewMethod(args: { contractId: string; method: string; args: Record<string, any> }) {
87+
async viewMethod({ contractId, method, args }: { contractId: string; method: string; args: Record<string, any> }) {
8888
const rpc = "https://relmn.aurora.dev";
8989
const res = await fetch(rpc, {
9090
headers: { "Content-Type": "application/json" },
@@ -96,8 +96,8 @@ class Intents {
9696
params: {
9797
request_type: "call_function",
9898
finality: "final",
99-
account_id: args.contractId,
100-
method_name: args.method,
99+
account_id: contractId,
100+
method_name: method,
101101
args_base64: base64.encode(new TextEncoder().encode(JSON.stringify(args))),
102102
},
103103
}),

wibe3/package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@hot-labs/wibe3",
3-
"version": "0.2.2",
3+
"version": "0.2.3",
44
"description": "Wibe3 is web3 sdk for vibe coders",
55
"license": "ISC",
66
"author": "",
@@ -16,7 +16,8 @@
1616
},
1717
"dependencies": {
1818
"@creit.tech/stellar-wallets-kit": "^1.9.1",
19-
"@hot-labs/near-connect": "0.6.4",
19+
"@hot-labs/near-connect": "^0.6.5",
20+
"@hot-labs/omni-sdk": "^2.20.14",
2021
"@near-js/crypto": "^2.3.3",
2122
"@near-js/utils": "^2.2.4",
2223
"@reown/appkit": "^1.8.8",

wibe3/src/client.ts

Lines changed: 59 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
TonWallet,
1212
EventEmitter,
1313
} from "@hot-labs/near-connect";
14+
import { HotBridge, utils } from "@hot-labs/omni-sdk";
1415
import { StellarWalletsKit, allowAllModules, WalletNetwork } from "@creit.tech/stellar-wallets-kit";
1516
import { base, bsc, mainnet, solana } from "@reown/appkit/networks";
1617
import { EthersAdapter } from "@reown/appkit-adapter-ethers";
@@ -36,10 +37,17 @@ const initialConfig: WibeClientOptions = {
3637
icons: ["https://wibe.io/favicon.ico"],
3738
};
3839

40+
const hotBridge = new HotBridge({});
41+
3942
export class Wibe3Client {
4043
private hotConnector: HotConnector;
4144
wallet: NearWallet | EvmWallet | SolanaWallet | StellarWallet | TonWallet | null = null;
42-
events: EventEmitter<{ connect: { wallet: ChainAbstracted }; disconnect: {} }>;
45+
balances: TokenBalance[] = [];
46+
events = new EventEmitter<{
47+
connect: { wallet: ChainAbstracted };
48+
"balance:changed": { balances: TokenBalance[] };
49+
disconnect: {};
50+
}>();
4351

4452
onConnect: (wallet: ChainAbstracted) => void = () => {};
4553
onDisconnect: () => void = () => {};
@@ -53,16 +61,19 @@ export class Wibe3Client {
5361
div.style.display = "none";
5462
}
5563

56-
this.events = new EventEmitter<{ connect: { wallet: ChainAbstracted }; disconnect: {} }>();
57-
5864
this.hotConnector = new HotConnector({
5965
onConnect: (wallet) => {
6066
this.wallet = wallet;
67+
this.balances = [];
6168
this.events.emit("connect", { wallet: wallet as ChainAbstracted });
69+
this.events.emit("balance:changed", { balances: [] });
70+
this.refreshBalances();
6271
},
6372

6473
onDisconnect: () => {
6574
this.wallet = null;
75+
this.balances = [];
76+
this.events.emit("balance:changed", { balances: [] });
6677
this.events.emit("disconnect", {});
6778
},
6879

@@ -88,21 +99,32 @@ export class Wibe3Client {
8899
});
89100
}
90101

91-
async getBalance(token: OmniToken): Promise<TokenBalance> {
102+
async refreshBalances() {
103+
this.balances = await this.getBalances(Object.values(OmniToken));
104+
this.events.emit("balance:changed", { balances: this.balances });
105+
}
106+
107+
async getBalances(tokens: OmniToken[]): Promise<TokenBalance[]> {
92108
if (!this.wallet) throw new Error("No wallet connected");
93109
const tradingAddress = await this.wallet.getIntentsAddress();
94-
const balances = await this.hotConnector.intents.getIntentsBalances([token], tradingAddress);
95-
const metadata = OmniTokenMetadata[token];
96-
return {
97-
int: balances[token] || 0n,
98-
id: metadata.contractId,
99-
float: Number(balances[token] || 0) / Math.pow(10, metadata.decimals),
100-
decimals: metadata.decimals,
101-
symbol: metadata.symbol,
102-
};
110+
const balances = await this.hotConnector.intents.getIntentsBalances(tokens, tradingAddress);
111+
112+
return tokens.map((token) => {
113+
const metadata = OmniTokenMetadata[token];
114+
const icon = `https://storage.herewallet.app/ft/1010:${metadata.contractId}.png`;
115+
116+
return {
117+
icon,
118+
int: balances[token] || 0n,
119+
id: metadata.contractId,
120+
float: Number(balances[token] || 0) / Math.pow(10, metadata.decimals),
121+
decimals: metadata.decimals,
122+
symbol: metadata.symbol,
123+
};
124+
});
103125
}
104126

105-
async isSignedIn() {
127+
get isSignedIn() {
106128
return !!this.wallet;
107129
}
108130

@@ -124,22 +146,39 @@ export class Wibe3Client {
124146
};
125147
}
126148

127-
async withdraw() {}
149+
async withdraw(args: { token: OmniToken; amount: number }) {
150+
if (!this.wallet) throw new Error("No wallet connected");
151+
if (this.wallet.type !== WalletType.NEAR) throw new Error("Only NEAR wallet can withdraw");
152+
153+
const token = OmniTokenMetadata[args.token];
154+
await hotBridge.withdrawToken({
155+
chain: 1010,
156+
token: token.contractId,
157+
amount: BigInt(utils.parseAmount(args.amount, token.decimals)),
158+
intentAccount: await this.wallet.getIntentsAddress(),
159+
receiver: await this.wallet.getAddress(),
160+
signIntents: (t) => this.wallet!.signIntents(t),
161+
});
162+
}
128163
}
129164

130165
export const useWibe3 = (wibe3: Wibe3Client) => {
131166
const [wallet, setWallet] = useState<ChainAbstracted | null>(wibe3.wallet);
167+
const [balances, setBalances] = useState<TokenBalance[]>(wibe3.balances);
132168
const [address, setAddress] = useState<string | null>(null);
133169
const [tradingAddress, setTradingAddress] = useState<string | null>(null);
134170

135171
useEffect(() => {
172+
const onBalanceChanged = (t: { balances: TokenBalance[] }) => setBalances(t.balances);
136173
const onConnect = (t: { wallet: ChainAbstracted }) => setWallet(t.wallet);
137174
const onDisconnect = () => setWallet(null);
138175
wibe3.events.on("connect", onConnect);
139176
wibe3.events.on("disconnect", onDisconnect);
177+
wibe3.events.on("balance:changed", onBalanceChanged);
140178
return () => {
141179
wibe3.events.off("connect", onConnect);
142180
wibe3.events.off("disconnect", onDisconnect);
181+
wibe3.events.off("balance:changed", onBalanceChanged);
143182
};
144183
}, [wibe3]);
145184

@@ -151,7 +190,6 @@ export const useWibe3 = (wibe3: Wibe3Client) => {
151190

152191
const connect = useCallback(async () => {
153192
await wibe3.connect();
154-
setWallet(wallet);
155193
}, []);
156194

157195
const auth = useCallback(async () => {
@@ -161,16 +199,15 @@ export const useWibe3 = (wibe3: Wibe3Client) => {
161199

162200
const disconnect = useCallback(async () => {
163201
await wibe3.disconnect();
164-
setWallet(null);
165202
}, []);
166203

167-
const getBalance = useCallback(async (token: OmniToken) => {
168-
return wibe3.getBalance(token);
204+
const refresh = useCallback(async () => {
205+
await wibe3.refreshBalances();
169206
}, []);
170207

171-
const withdraw = useCallback(async () => {
172-
await wibe3.withdraw();
208+
const withdraw = useCallback(async (token: OmniToken, amount: number) => {
209+
await wibe3.withdraw({ token, amount });
173210
}, []);
174211

175-
return { address, connect, auth, disconnect, getBalance, tradingAddress, withdraw };
212+
return { address, connect, auth, disconnect, balances, tradingAddress, withdraw, refresh };
176213
};

wibe3/src/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,5 @@ export interface TokenBalance {
3535
float: number;
3636
decimals: number;
3737
symbol: string;
38+
icon: string;
3839
}

wibe3/src/wallet.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import crypto from "crypto";
1+
import { sha256 } from "@noble/hashes/sha2";
22
import { KeyPair, KeyPairString } from "@near-js/crypto";
33
import { Intents, base58 } from "@hot-labs/near-connect";
44
import { AuthCommitment, OmniToken, OmniTokenMetadata, TrasferIntent, TokenBalance } from "./types";
@@ -7,8 +7,9 @@ class Wibe3Wallet {
77
#keyPair: KeyPair;
88
intents: Intents;
99

10-
constructor({ privateKey }: { privateKey: KeyPairString }) {
11-
this.#keyPair = KeyPair.fromString(privateKey);
10+
constructor({ privateKey }: { privateKey: string }) {
11+
const key = privateKey.startsWith("ed25519:") ? (privateKey as KeyPairString) : `ed25519:${privateKey}`;
12+
this.#keyPair = KeyPair.fromString(key as KeyPairString);
1213
this.intents = new Intents();
1314
}
1415

@@ -23,12 +24,14 @@ class Wibe3Wallet {
2324
async getBalance(token: OmniToken): Promise<TokenBalance> {
2425
const balances = await this.intents.getIntentsBalances([token], this.tradingAddress);
2526
const metadata = OmniTokenMetadata[token];
27+
const icon = `https://storage.herewallet.app/ft/1010:${metadata.contractId}.png`;
2628
return {
2729
int: balances[token] || 0n,
2830
id: metadata.contractId,
2931
float: Number(balances[token] || 0) / Math.pow(10, metadata.decimals),
3032
decimals: metadata.decimals,
3133
symbol: metadata.symbol,
34+
icon,
3235
};
3336
}
3437

@@ -41,8 +44,8 @@ class Wibe3Wallet {
4144
receiver_id: args.to.toLowerCase(),
4245
};
4346

44-
const hash = crypto.createHash("sha256").update(args.paymentId, "utf8").digest();
45-
const signed = await this.signIntents({ nonce: new Uint8Array(hash).slice(0, 32), intents: [intent] });
47+
const nonce = new Uint8Array(sha256(args.paymentId)).slice(0, 32);
48+
const signed = await this.signIntents({ nonce, intents: [intent] });
4649
await this.intents.publishSignedIntents([signed]);
4750
}
4851

0 commit comments

Comments
 (0)