1
+ import {
2
+ Chain ,
3
+ GatewayTransfer ,
4
+ GatewayTransferDetails ,
5
+ Network ,
6
+ TokenId ,
7
+ Wormhole ,
8
+ amount ,
9
+ wormhole ,
10
+ } from "@wormhole-foundation/sdk" ;
11
+
12
+ // Import the platform specific packages
13
+
14
+ import cosmwasm from "@wormhole-foundation/sdk/cosmwasm" ;
15
+ import evm from "@wormhole-foundation/sdk/evm" ;
16
+ import solana from "@wormhole-foundation/sdk/solana" ;
17
+ import { SignerStuff , getSigner } from "./helpers/index.js" ;
18
+
19
+ // We're going to transfer into, around, and out of the Cosmos ecosystem
20
+ // First on Avalanche, transparently through gateway and over IBC to Cosmoshub
21
+ // Then over IBC, transparently through gateway and over IBC to Osmosis
22
+ // Finally out of Osmosis, transparently through gateway, out to Avalanche
23
+
24
+ // eg:
25
+ // Avalanche[avax] => {Gateway ->}Osmosis[gateway/wrapped avax]
26
+ // Osmosis[gateway/wrapped avax] -> {Gateway ->} Cosmoshub[gateway/wrapped avax]
27
+ // Cosmoshub[gateway/wrapped avax] -> {Gateway} => Avalanch[avax]
28
+
29
+ // Key:
30
+ // => : Regular contract call
31
+ // -> : IBC Transfer
32
+ // {*}: Transparently handled by Gateway
33
+
34
+ ( async function ( ) {
35
+ // init Wormhole object, passing config for which network
36
+ // to use (e.g. Mainnet/Testnet) and what Platforms to support
37
+ const wh = await wormhole ( "Mainnet" , [ evm , solana , cosmwasm ] ) ;
38
+ // Pick up where you left off by updating the txids as you go
39
+ let fakeIt = false ;
40
+
41
+ // Grab chain Contexts for each leg of our journey
42
+ const external = wh . getChain ( "Solana" ) ;
43
+ const cosmos1 = wh . getChain ( "Dymension" ) ;
44
+ const cosmos2 = wh . getChain ( "Injective" ) ;
45
+
46
+ // Get signer from local key but anything that implements
47
+ // Signer interface (e.g. wrapper around web wallet) should work
48
+ const leg1 = await getSigner ( external ) ;
49
+ const leg2 = await getSigner ( cosmos1 ) ;
50
+ const leg3 = await getSigner ( cosmos2 ) ;
51
+
52
+ // we'll use the native token on the source chain
53
+ const token : TokenId = Wormhole . tokenId ( external . chain , "native" ) ;
54
+ const amt = amount . units ( amount . parse ( "0.001" , external . config . nativeTokenDecimals ) ) ;
55
+
56
+ // Transfer native token from source chain, through gateway, to a cosmos chain
57
+ let route1 = fakeIt
58
+ ? await GatewayTransfer . from (
59
+ wh ,
60
+ {
61
+ chain : external . chain ,
62
+ txid : "5y2BnJ1Nwqe4m6KTSrry5Ni88xqVrqo4jdbuNwAPDuXEonQRVLbALf7abViwucKKr8U8cDfJtDmqnuRAAC6i6wtb" ,
63
+ } ,
64
+ 600_000 ,
65
+ )
66
+ : await transferIntoCosmos ( wh , token , amt , leg1 , leg2 ) ;
67
+ console . log ( "Route 1 (External => Cosmos)" , route1 ) ;
68
+
69
+ // Lookup the Gateway representation of the wrappd token
70
+ const { denom } = route1 . ibcTransfers ! [ 0 ] ! . data ;
71
+ const cosmosTokenAddress = Wormhole . parseAddress ( "Wormchain" , denom ) ;
72
+
73
+ // Transfer Gateway factory tokens over IBC through gateway to another Cosmos chain
74
+ let route2 = fakeIt
75
+ ? await GatewayTransfer . from (
76
+ wh ,
77
+ {
78
+ chain : cosmos1 . chain ,
79
+ txid : "3014CABA727C8A1BFCBD282095C771ACBAB3B13CC595B702ABFD3A4502315FBD" ,
80
+ } ,
81
+ 600_000 ,
82
+ )
83
+ : await transferBetweenCosmos (
84
+ wh ,
85
+ { chain : cosmos1 . chain , address : cosmosTokenAddress } ,
86
+ 1000n ,
87
+ leg2 ,
88
+ leg3 ,
89
+ ) ;
90
+ console . log ( "Route 2 (Cosmos -> Cosmos): " , route2 ) ;
91
+
92
+ // Transfer Gateway factory token through gateway back to source chain
93
+ let route3 = fakeIt
94
+ ? await GatewayTransfer . from (
95
+ wh ,
96
+ {
97
+ chain : cosmos2 . chain ,
98
+ txid : "BEDD0CE2FEA8FF5DF81FCA5142E72745E154F87D496CDA147FC4D5D46A7C7D81" ,
99
+ } ,
100
+ 600_000 ,
101
+ )
102
+ : await transferOutOfCosmos (
103
+ wh ,
104
+ { chain : cosmos2 . chain , address : cosmosTokenAddress } ,
105
+ 1000n ,
106
+ leg3 ,
107
+ leg1 ,
108
+ ) ;
109
+ console . log ( "Route 3 (Cosmos => External): " , route3 ) ;
110
+ } ) ( ) ;
111
+
112
+ async function transferIntoCosmos (
113
+ wh : Wormhole < Network > ,
114
+ token : TokenId ,
115
+ amount : bigint ,
116
+ src : SignerStuff < Network , Chain > ,
117
+ dst : SignerStuff < Network , Chain > ,
118
+ ) : Promise < GatewayTransfer < Network > > {
119
+ // EXAMPLE_GATEWAY_INBOUND
120
+ console . log (
121
+ `Beginning transfer into Cosmos from ${ src . chain . chain } :${ src . address . address . toString ( ) } to ${
122
+ dst . chain . chain
123
+ } :${ dst . address . address . toString ( ) } `,
124
+ ) ;
125
+
126
+ const xfer = await GatewayTransfer . from ( wh , {
127
+ token : token ,
128
+ amount : amount ,
129
+ from : src . address ,
130
+ to : dst . address ,
131
+ } as GatewayTransferDetails ) ;
132
+ console . log ( "Created GatewayTransfer: " , xfer . transfer ) ;
133
+
134
+ const srcTxIds = await xfer . initiateTransfer ( src . signer ) ;
135
+ console . log ( "Started transfer on source chain" , srcTxIds ) ;
136
+
137
+ const attests = await xfer . fetchAttestation ( 600_000 ) ;
138
+ console . log ( "Got Attestations" , attests ) ;
139
+ // EXAMPLE_GATEWAY_INBOUND
140
+
141
+ return xfer ;
142
+ }
143
+
144
+ async function transferBetweenCosmos < N extends Network > (
145
+ wh : Wormhole < N > ,
146
+ token : TokenId ,
147
+ amount : bigint ,
148
+ src : SignerStuff < N , Chain > ,
149
+ dst : SignerStuff < N , Chain > ,
150
+ ) : Promise < GatewayTransfer < N > > {
151
+ // EXAMPLE_GATEWAY_INTERCOSMOS
152
+ console . log (
153
+ `Beginning transfer within cosmos from ${
154
+ src . chain . chain
155
+ } :${ src . address . address . toString ( ) } to ${ dst . chain . chain } :${ dst . address . address . toString ( ) } `,
156
+ ) ;
157
+
158
+ const xfer = await GatewayTransfer . from ( wh , {
159
+ token : token ,
160
+ amount : amount ,
161
+ from : src . address ,
162
+ to : dst . address ,
163
+ } as GatewayTransferDetails ) ;
164
+ console . log ( "Created GatewayTransfer: " , xfer . transfer ) ;
165
+
166
+ const srcTxIds = await xfer . initiateTransfer ( src . signer ) ;
167
+ console . log ( "Started transfer on source chain" , srcTxIds ) ;
168
+
169
+ const attests = await xfer . fetchAttestation ( 60_000 ) ;
170
+ console . log ( "Got attests: " , attests ) ;
171
+ // EXAMPLE_GATEWAY_INTERCOSMOS
172
+
173
+ return xfer ;
174
+ }
175
+
176
+ async function transferOutOfCosmos < N extends Network > (
177
+ wh : Wormhole < N > ,
178
+ token : TokenId ,
179
+ amount : bigint ,
180
+ src : SignerStuff < N , Chain > ,
181
+ dst : SignerStuff < N , Chain > ,
182
+ ) : Promise < GatewayTransfer < N > > {
183
+ // EXAMPLE_GATEWAY_OUTBOUND
184
+ console . log (
185
+ `Beginning transfer out of cosmos from ${
186
+ src . chain . chain
187
+ } :${ src . address . address . toString ( ) } to ${ dst . chain . chain } :${ dst . address . address . toString ( ) } `,
188
+ ) ;
189
+
190
+ const xfer = await GatewayTransfer . from ( wh , {
191
+ token : token ,
192
+ amount : amount ,
193
+ from : src . address ,
194
+ to : dst . address ,
195
+ } as GatewayTransferDetails ) ;
196
+ console . log ( "Created GatewayTransfer: " , xfer . transfer ) ;
197
+ const srcTxIds = await xfer . initiateTransfer ( src . signer ) ;
198
+ console . log ( "Started transfer on source chain" , srcTxIds ) ;
199
+
200
+ const attests = await xfer . fetchAttestation ( 600_000 ) ;
201
+ console . log ( "Got attests" , attests ) ;
202
+
203
+ // Since we're leaving cosmos, this is required to complete the transfer
204
+ const dstTxIds = await xfer . completeTransfer ( dst . signer ) ;
205
+ console . log ( "Completed transfer on destination chain" , dstTxIds ) ;
206
+ // EXAMPLE_GATEWAY_OUTBOUND
207
+
208
+ return xfer ;
209
+ }
0 commit comments