Skip to content

Commit ca66ecd

Browse files
authored
feat(ts-sdk): next dev iteration (#2854)
2 parents e292ee7 + 11f6a28 commit ca66ecd

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+1488
-1740
lines changed

dictionary.txt

+4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
12
0xbonlulu
23
0xc0dejug
34
0xkaiserkarel
@@ -144,6 +145,7 @@ Proxiable
144145
Pruijs
145146
QUMGLDJ
146147
Quickstart
148+
Qyby
147149
RUSTFLAGS
148150
Recvs
149151
Redelegate
@@ -789,6 +791,7 @@ neondb
789791
netgo
790792
netutil
791793
networkid
794+
neverthrow
792795
newacc
793796
newtype
794797
nextest
@@ -1069,6 +1072,7 @@ storetypes
10691072
storyblok
10701073
strangelove
10711074
stretchr
1075+
stridenet
10721076
stridepub
10731077
stridevalcons
10741078
stridevalconspub

flake.nix

+1
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,7 @@
242242
./site/site.nix
243243
./site/openapi.nix
244244
./lib/near/near.nix
245+
./typescript-sdk/typescript-sdk.nix
245246
./light-clients/ethereum-light-client/ethereum-light-client.nix
246247
./light-clients/cometbls-light-client/cometbls-light-client.nix
247248
./light-clients/tendermint-light-client/tendermint-light-client.nix

typescript-sdk/README.md

+41-51
Original file line numberDiff line numberDiff line change
@@ -1,71 +1,61 @@
11
> [!NOTE] Work in progress
22
3-
<br />
4-
5-
<p align="center">
6-
<img width="675" src="https://i.imgur.com/yFpIuzm.jpeg" alt="Union logo" />
7-
</p>
8-
<br />
9-
<p align="center">
10-
<!-- <a href="https://npmjs.com/package/@unionlabs/client"><img src="https://img.shields.io/npm/v/@unionlabs/client.svg" alt="npm package"></a> -->
11-
</p>
12-
133
<h1 align="center" style="font-size: 2.75rem; font-weight: 900; color: white;">Union Labs TypeScript SDK</h1>
144

5+
[![JSR](https://jsr.io/badges/@union/client)](https://jsr.io/@union/client)
6+
157
Union Labs TypeScript SDK providing utilities for cross-chain transfers and more.
168

179
```sh
1810
npx jsr add @union/client
1911
```
2012

21-
### Quick Start
13+
## Usage
14+
15+
### Initiate a client
2216

2317
```ts
24-
import { http } from "viem"
25-
import { sepolia } from "viem/chains"
26-
import { createCosmosSdkClient, cosmosHttp } from "@union/client"
27-
28-
29-
const unionClient = createCosmosSdkClient({
30-
evm: {
31-
chain: sepolia,
32-
// browser wallet or `privateKeyToAccount` from `viem/accounts`
33-
account: evmAccount,
34-
transport: http("https://rpc2.sepolia.org")
35-
},
36-
cosmos: {
37-
// browser wallet or `DirectSecp256k1Wallet.fromKey`
38-
account: cosmosAccount,
39-
gasPrice: { amount: "0.0025", denom: "muno" },
40-
transport: cosmosHttp("https://rpc.testnet.bonlulu.uno")
41-
}
42-
})
18+
import { createUnionClient } from "@union/client"
19+
import { privateKeyToAccount } from "viem/accounts"
4320

44-
const gasCostResponse = await unionClient.simulateTransaction({
45-
amount: 1n,
46-
network: "evm",
47-
sourceChannel: "channel-69",
48-
path: ["11155111", "union-testnet-8"],
49-
recipient: "union14qemq0vw6y3gc3u3e0aty2e764u4gs5lnxk4rv",
50-
denomAddress: "0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238",
51-
relayContractAddress: "0x3C148Ec863404e48d88757E88e456963A14238ef"
21+
const client = createUnionClient({
22+
chainId: "11155111",
23+
transport: http("https://rpc.sepolia.org"),
24+
account: privateKeyToAccount(`0x${PRIVATE_KEY}`) // or from wagmi configuration
5225
})
26+
```
5327

54-
if(!gasCostResponse.success) {
55-
throw new Error("Failed to simulate transaction")
56-
}
28+
### Examples
29+
30+
Transfer `strd` from Stride Testnet on Cosmos (`stride-internal-1`) chain to Sepolia on EVM (`1111551111`) chain.
5731

58-
console.info("Gas cost", gasCostResponse.data)
32+
```ts
33+
import { DirectSecp256k1Wallet } from "@cosmjs/proto-signing"
34+
import { createUnionClient, hexStringToUint8Array } from "@union/client"
35+
36+
const PRIVATE_KEY = process.env.PRIVATE_KEY
37+
38+
const cosmosAccount = await DirectSecp256k1Wallet.fromKey(
39+
Uint8Array.from(hexStringToUint8Array(PRIVATE_KEY)),
40+
"stride"
41+
)
42+
43+
const client = createUnionClient({
44+
account: cosmosAccount,
45+
chainId: "stride-internal-1",
46+
transport: http("stride.testnet-1.stridenet.co"),
47+
})
5948

60-
const transfer = await unionClient.transferAsset({
49+
const transfer = await client.transferAsset({
6150
amount: 1n,
62-
network: "evm",
63-
sourceChannel: "channel-69",
64-
path: ["11155111", "union-testnet-8"],
65-
recipient: "union14qemq0vw6y3gc3u3e0aty2e764u4gs5lnxk4rv",
66-
denomAddress: "0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238",
67-
relayContractAddress: "0x3C148Ec863404e48d88757E88e456963A14238ef"
51+
denomAddress: "strd",
52+
destinationChainId: "11155111",
53+
recipient: "0x8478B37E983F520dBCB5d7D3aAD8276B82631aBd",
6854
})
69-
```
7055

71-
See [`./playground/berachain-to-union.ts`](./playground/berachain-to-union.ts) and [`./playground`](./playground) in general for more examples.
56+
if (transfer.isErr()) {
57+
return console.error("Transfer failed", transfer.error)
58+
}
59+
60+
return console.info("Transfer successful", transfer.value)
61+
```

typescript-sdk/bun.lockb

-9.53 KB
Binary file not shown.

typescript-sdk/jsr.json

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
{
22
"$schema": "https://jsr.io/schema/config-file.v1.json",
33
"name": "@union/client",
4-
"version": "0.0.1-rc.53",
4+
"version": "0.0.1-rc.66",
5+
"license": "MIT",
56
"exports": {
67
".": "./src/mod.ts"
78
},
89
"publish": {
9-
"include": ["./src/**/*.ts", "./jsr.json"]
10+
"include": ["./src/**/*.ts", "./jsr.json", "./README.md"]
1011
}
1112
}

typescript-sdk/package.json

+8-10
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
{
22
"name": "@union/client",
3-
"version": "0.0.1-rc.53",
4-
"description": "Union Labs cross-chain transfers client",
3+
"version": "0.0.1-rc.66",
54
"homepage": "https://jsr.io/@union/client",
5+
"description": "Union Labs cross-chain transfers client",
66
"type": "module",
77
"exports": "./src/mod.ts",
88
"scripts": {
@@ -18,29 +18,26 @@
1818
"clean": "rm -rf dist node_modules",
1919
"postinstall": "patch-package"
2020
},
21-
"imports": {
22-
"#*": "./src/*"
23-
},
2421
"dependencies": {
2522
"@cosmjs/cosmwasm-stargate": "0.32.4",
2623
"@cosmjs/stargate": "0.32.4",
24+
"neverthrow": "^7.1.0",
2725
"ofetch": "^1.3.4",
28-
"viem": "^2.19.3"
26+
"viem": "^2.21.1"
2927
},
3028
"devDependencies": {
3129
"@cosmjs/tendermint-rpc": "^0.32.4",
3230
"@cosmjs/proto-signing": "^0.32.4",
3331
"@arethetypeswrong/cli": "^0.15.4",
3432
"@cosmjs/amino": "0.32.4",
3533
"@scure/base": "^1.1.7",
36-
"@total-typescript/ts-reset": "^0.5.1",
37-
"@types/bun": "^1.1.6",
38-
"@types/node": "^22.2.0",
34+
"@total-typescript/ts-reset": "^0.6.0",
35+
"@types/bun": "^1.1.8",
36+
"@types/node": "^22.5.2",
3937
"consola": "^3.2.3",
4038
"cosmjs-types": "^0.9.0",
4139
"jsr": "^0.13.1",
4240
"patch-package": "^8.0.0",
43-
"tsx": "^4.17.0",
4441
"typescript": "^5.5.4",
4542
"vite-tsconfig-paths": "^5.0.1",
4643
"vitest": "^2.0.5"
@@ -54,6 +51,7 @@
5451
"url": "https://github.com/unionlabs/union.git",
5552
"directory": "typescript-sdk"
5653
},
54+
"license": "MIT",
5755
"engineStrict": true,
5856
"sideEffects": false
5957
}

typescript-sdk/playground/arbitrum-to-union.ts

+19-39
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { consola } from "scripts/logger"
55
import { raise } from "#utilities/index.ts"
66
import { arbitrumSepolia } from "viem/chains"
77
import { privateKeyToAccount } from "viem/accounts"
8-
import { createCosmosSdkClient, offchainQuery, type TransferAssetsParameters } from "#mod.ts"
8+
import { createUnionClient, type TransferAssetsParameters } from "#mod.ts"
99

1010
/* `bun playground/arbitrum-to-union.ts --private-key "..."` */
1111

@@ -26,60 +26,40 @@ const evmAccount = privateKeyToAccount(`0x${PRIVATE_KEY}`)
2626
const LINK_CONTRACT_ADDRESS = "0xb1d4538b4571d411f07960ef2838ce337fe1e80e"
2727

2828
try {
29-
/**
30-
* Calls Hubble, Union's indexer, to grab desired data that's always up-to-date.
31-
*/
32-
const {
33-
data: [arbitrumInfo]
34-
} = await offchainQuery.chain({
29+
const client = createUnionClient({
30+
account: evmAccount,
3531
chainId: `${arbitrumSepolia.id}`,
36-
includeEndpoints: true,
37-
includeContracts: true
38-
})
39-
if (!arbitrumInfo) raise("Berachain info not found")
40-
41-
const ucsConfiguration = arbitrumInfo.ucs1_configurations
42-
?.filter(config => config.destination_chain.chain_id === "union-testnet-8")
43-
.at(0)
44-
45-
if (!ucsConfiguration) raise("UCS configuration not found")
46-
47-
const { channel_id, contract_address, source_chain, destination_chain } = ucsConfiguration
48-
49-
const client = createCosmosSdkClient({
50-
evm: {
51-
account: evmAccount,
52-
chain: arbitrumSepolia,
53-
transport: fallback([http(arbitrumSepolia?.rpcUrls.default.http.at(0))])
54-
}
32+
transport: fallback([http(arbitrumSepolia?.rpcUrls.default.http.at(0))])
5533
})
5634

5735
const transactionPayload = {
5836
amount: 1n,
59-
approve: true,
60-
sourceChannel: channel_id,
61-
network: arbitrumInfo.rpc_type,
37+
autoApprove: true,
6238
denomAddress: LINK_CONTRACT_ADDRESS,
63-
relayContractAddress: contract_address,
39+
destinationChainId: "union-testnet-8",
6440
// or `client.cosmos.account.address` if you want to send to yourself
65-
recipient: "union14qemq0vw6y3gc3u3e0aty2e764u4gs5lnxk4rv",
66-
path: [source_chain.chain_id, destination_chain.chain_id]
67-
} satisfies TransferAssetsParameters
41+
recipient: "union14qemq0vw6y3gc3u3e0aty2e764u4gs5lnxk4rv"
42+
} satisfies TransferAssetsParameters<"421614">
6843

6944
const gasEstimationResponse = await client.simulateTransaction(transactionPayload)
7045

71-
consola.info(`Gas cost: ${gasEstimationResponse.data}`)
46+
if (gasEstimationResponse.isErr()) {
47+
consola.error(gasEstimationResponse.error)
48+
process.exit(1)
49+
}
50+
51+
consola.success("Union to Berachain gas cost:", gasEstimationResponse.value)
7252

7353
if (ONLY_ESTIMATE_GAS) process.exit(0)
7454

75-
if (!gasEstimationResponse.success) {
76-
console.info("Transaction simulation failed")
55+
const transfer = await client.transferAsset(transactionPayload)
56+
57+
if (transfer.isErr()) {
58+
console.error(transfer.error)
7759
process.exit(1)
7860
}
7961

80-
const transfer = await client.transferAsset(transactionPayload)
81-
82-
consola.info(transfer)
62+
consola.info(transfer.value)
8363
} catch (error) {
8464
const errorMessage = error instanceof Error ? error.message : error
8565
console.error(errorMessage)

0 commit comments

Comments
 (0)