-
Notifications
You must be signed in to change notification settings - Fork 70
/
Copy pathindex.html
170 lines (148 loc) · 88.8 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
<!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>Wormhole TS SDK - v0.7.0</title><meta name="description" content="Documentation for Wormhole TS SDK"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="assets/style.css"/><link rel="stylesheet" href="assets/highlight.css"/><script defer src="assets/main.js"></script><script async src="assets/icons.js" id="tsd-icons-script"></script><script async src="assets/search.js" id="tsd-search-script"></script><script async src="assets/navigation.js" id="tsd-nav-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><div class="table-cell" id="tsd-search" data-base="."><div class="field"><label for="tsd-search-field" class="tsd-widget tsd-toolbar-icon search no-caption"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="assets/icons.svg#icon-search"></use></svg></label><input type="text" id="tsd-search-field" aria-label="Search"/></div><div class="field"><div id="tsd-toolbar-links"></div></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="index.html" class="title">Wormhole TS SDK - v0.7.0</a></div><div class="table-cell" id="tsd-widgets"><a href="#" class="tsd-widget tsd-toolbar-icon menu no-caption" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="assets/icons.svg#icon-menu"></use></svg></a></div></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><h2>Wormhole TS SDK - v0.7.0</h2></div><div class="tsd-panel tsd-typography"><a id="md:wormhole-ts-sdk" class="tsd-anchor"></a><h1><a href="#md:wormhole-ts-sdk">Wormhole TS SDK</a></h1><p>The Wormhole Typescript SDK is useful for interacting with the chains Wormhole supports and the <a href="#md:protocols">protocols</a> built on top of Wormhole.</p>
<a id="md:warning" class="tsd-anchor"></a><h2><a href="#md:warning">Warning</a></h2><p>:warning: This package is a Work in Progress so the interface may change and there are likely bugs. Please <a href="https://github.com/wormhole-foundation/wormhole-sdk-ts/issues">report</a> any issues you find. :warning:</p>
<a id="md:installation" class="tsd-anchor"></a><h2><a href="#md:installation">Installation</a></h2><a id="md:basic" class="tsd-anchor"></a><h3><a href="#md:basic">Basic</a></h3><p>Install the (meta) package</p>
<pre><code class="language-bash"><span class="hl-0">npm</span><span class="hl-1"> </span><span class="hl-2">install</span><span class="hl-1"> </span><span class="hl-2">@wormhole-foundation/sdk</span>
</code><button>Copy</button></pre>
<p>This package combines all the individual packages in a way that makes setup easier while still allowing for tree shaking. </p>
<a id="md:advanced" class="tsd-anchor"></a><h3><a href="#md:advanced">Advanced</a></h3><p>Alternatively, for an advanced user, install a specific set of the packages published.</p>
<pre><code class="language-bash"><span class="hl-3"># constants</span><br/><span class="hl-0">npm</span><span class="hl-1"> </span><span class="hl-2">install</span><span class="hl-1"> </span><span class="hl-2">@wormhole-foundation/sdk-base</span><br/><span class="hl-3"># contract interfaces, basic types, vaa payload definitions</span><br/><span class="hl-0">npm</span><span class="hl-1"> </span><span class="hl-2">install</span><span class="hl-1"> </span><span class="hl-2">@wormhole-foundation/sdk-definitions</span><br/><span class="hl-3"># Evm specific utilities</span><br/><span class="hl-0">npm</span><span class="hl-1"> </span><span class="hl-2">install</span><span class="hl-1"> </span><span class="hl-2">@wormhole-foundation/sdk-evm</span><br/><span class="hl-3"># Evm TokenBridge protocol client</span><br/><span class="hl-0">npm</span><span class="hl-1"> </span><span class="hl-2">install</span><span class="hl-1"> </span><span class="hl-2">@wormhole-foundation/sdk-evm-tokenbridge</span>
</code><button>Copy</button></pre>
<a id="md:usage" class="tsd-anchor"></a><h2><a href="#md:usage">Usage</a></h2><p>Getting started is simple, just import Wormhole and the <a href="#md:platforms">Platform</a> modules you wish to support</p>
<!--EXAMPLE_IMPORTS-->
<pre><code class="language-ts"><span class="hl-4">import</span><span class="hl-1"> { </span><span class="hl-5">wormhole</span><span class="hl-1"> } </span><span class="hl-4">from</span><span class="hl-1"> </span><span class="hl-2">"@wormhole-foundation/sdk"</span><span class="hl-1">;</span>
</code><button>Copy</button></pre>
<p>See example <a href="https://github.com/wormhole-foundation/wormhole-sdk-ts/blob/main/examples/src/index.ts#L2">here</a></p>
<!--EXAMPLE_IMPORTS-->
<p>And pass those to the Wormhole constructor to make them available for use</p>
<!--EXAMPLE_WORMHOLE_INIT-->
<pre><code class="language-ts"><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">wh</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-0">wormhole</span><span class="hl-1">(</span><span class="hl-2">"Testnet"</span><span class="hl-1">, [</span><span class="hl-5">evm</span><span class="hl-1">, </span><span class="hl-5">solana</span><span class="hl-1">, </span><span class="hl-5">aptos</span><span class="hl-1">, </span><span class="hl-5">algorand</span><span class="hl-1">, </span><span class="hl-5">cosmwasm</span><span class="hl-1">, </span><span class="hl-5">sui</span><span class="hl-1">]);</span>
</code><button>Copy</button></pre>
<p>See example <a href="https://github.com/wormhole-foundation/wormhole-sdk-ts/blob/main/examples/src/index.ts#L16">here</a></p>
<!--EXAMPLE_WORMHOLE_INIT-->
<p>With a configured Wormhole object, we have the ability to do things like; parse addresses for the platforms we passed, get a <a href="#md:chain-context">ChainContext</a> object, or fetch VAAs.</p>
<!--EXAMPLE_WORMHOLE_CHAIN-->
<pre><code class="language-ts"><span class="hl-1"> </span><span class="hl-3">// Grab a ChainContext object from our configured Wormhole instance</span><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">ctx</span><span class="hl-1"> = </span><span class="hl-5">wh</span><span class="hl-1">.</span><span class="hl-0">getChain</span><span class="hl-1">(</span><span class="hl-2">"Solana"</span><span class="hl-1">);</span>
</code><button>Copy</button></pre>
<p>See example <a href="https://github.com/wormhole-foundation/wormhole-sdk-ts/blob/main/examples/src/index.ts#L20">here</a></p>
<!--EXAMPLE_WORMHOLE_CHAIN-->
<!--EXAMPLE_WORMHOLE_VAA-->
<pre><code class="language-ts"><span class="hl-1"> </span><span class="hl-3">// Get the VAA from the wormhole message id</span><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">vaa</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">wh</span><span class="hl-1">.</span><span class="hl-0">getVaa</span><span class="hl-1">(</span><br/><span class="hl-1"> </span><span class="hl-3">// Wormhole Message ID</span><br/><span class="hl-1"> </span><span class="hl-5">whm</span><span class="hl-1">!,</span><br/><span class="hl-1"> </span><span class="hl-3">// Protocol:Payload name to use for decoding the VAA payload</span><br/><span class="hl-1"> </span><span class="hl-2">"TokenBridge:Transfer"</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-3">// Timeout in milliseconds, depending on the chain and network, the VAA may take some time to be available</span><br/><span class="hl-1"> </span><span class="hl-8">60_000</span><span class="hl-1">,</span><br/><span class="hl-1"> );</span>
</code><button>Copy</button></pre>
<p>See example <a href="https://github.com/wormhole-foundation/wormhole-sdk-ts/blob/main/examples/src/index.ts#L49">here</a></p>
<!--EXAMPLE_WORMHOLE_VAA-->
<p>Optionally, the default configuration may be overriden in the case that you want to support, eg a different RPC endpoint.</p>
<!--EXAMPLE_CONFIG_OVERRIDE-->
<pre><code class="language-ts"><span class="hl-1"> </span><span class="hl-3">// Pass a partial WormholeConfig object to override specific</span><br/><span class="hl-1"> </span><span class="hl-3">// fields in the default config</span><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">wh</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-0">wormhole</span><span class="hl-1">(</span><span class="hl-2">"Testnet"</span><span class="hl-1">, [</span><span class="hl-5">solana</span><span class="hl-1">], {</span><br/><span class="hl-1"> </span><span class="hl-5">chains:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-5">Solana:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-5">contracts:</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-5">coreBridge:</span><span class="hl-1"> </span><span class="hl-2">"11111111111111111111111111111"</span><span class="hl-1">,</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> </span><span class="hl-5">rpc:</span><span class="hl-1"> </span><span class="hl-2">"https://api.devnet.solana.com"</span><span class="hl-1">,</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> },</span><br/><span class="hl-1"> });</span>
</code><button>Copy</button></pre>
<p>See example <a href="https://github.com/wormhole-foundation/wormhole-sdk-ts/blob/main/examples/src/config.ts#L5">here</a></p>
<!--EXAMPLE_CONFIG_OVERRIDE-->
<a id="md:concepts" class="tsd-anchor"></a><h2><a href="#md:concepts">Concepts</a></h2><p>Understanding several higher level concepts of the SDK will help in using it effectively.</p>
<a id="md:platforms" class="tsd-anchor"></a><h3><a href="#md:platforms">Platforms</a></h3><p>Every chain is its own special snowflake but many of them share similar functionality. The <code>Platform</code> modules provide a consistent interface for interacting with the chains that share a platform.</p>
<p>Each platform can be installed separately so that dependencies can stay as slim as possible.</p>
<a id="md:chain-context" class="tsd-anchor"></a><h3><a href="#md:chain-context">Chain Context</a></h3><p>The <code>Wormhole</code> class provides a <code>getChain</code> method that returns a <code>ChainContext</code> object for a given chain. This object provides access to the chain specific methods and utilities. Much of the functionality in the <code>ChainContext</code> is provided by the <code>Platform</code> methods but the specific chain may have overridden methods.</p>
<p>The ChainContext object is also responsible for holding a cached rpc client and protocol clients.</p>
<pre><code class="language-ts"><span class="hl-3">// Get the chain context for the source and destination chains</span><br/><span class="hl-3">// This is useful to grab direct clients for the protocols</span><br/><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">srcChain</span><span class="hl-1"> = </span><span class="hl-5">wh</span><span class="hl-1">.</span><span class="hl-0">getChain</span><span class="hl-1">(</span><span class="hl-5">senderAddress</span><span class="hl-1">.</span><span class="hl-5">chain</span><span class="hl-1">);</span><br/><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">dstChain</span><span class="hl-1"> = </span><span class="hl-5">wh</span><span class="hl-1">.</span><span class="hl-0">getChain</span><span class="hl-1">(</span><span class="hl-5">receiverAddress</span><span class="hl-1">.</span><span class="hl-5">chain</span><span class="hl-1">);</span><br/><br/><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">tb</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">srcChain</span><span class="hl-1">.</span><span class="hl-0">getTokenBridge</span><span class="hl-1">(); </span><span class="hl-3">// => TokenBridge<'Evm'></span><br/><span class="hl-5">srcChain</span><span class="hl-1">.</span><span class="hl-0">getRpcClient</span><span class="hl-1">(); </span><span class="hl-3">// => RpcClient<'Evm'></span>
</code><button>Copy</button></pre>
<a id="md:addresses" class="tsd-anchor"></a><h3><a href="#md:addresses">Addresses</a></h3><p>Within the Wormhole context, addresses are often <a href="https://docs.wormhole.com/wormhole/blockchain-environments/evm#addresses">normalized</a> to 32 bytes and referred to in this SDK as a <code>UniversalAddresses</code>.</p>
<p>Each platform comes with an address type that understands the native address formats, unsurprisingly referred to as NativeAddress. This abstraction allows the SDK to work with addresses in a consistent way regardless of the underlying chain.</p>
<pre><code class="language-ts"><span class="hl-3">// Its possible to convert a string address to its Native address</span><br/><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">ethAddr</span><span class="hl-1">: </span><span class="hl-9">NativeAddress</span><span class="hl-1"><</span><span class="hl-2">"Evm"</span><span class="hl-1">> = </span><span class="hl-0">toNative</span><span class="hl-1">(</span><span class="hl-2">"Ethereum"</span><span class="hl-1">, </span><span class="hl-2">"0xbeef..."</span><span class="hl-1">);</span><br/><br/><span class="hl-3">// A common type in the SDK is the `ChainAddress` which provides</span><br/><span class="hl-3">// the additional context of the `Chain` this address is relevant for.</span><br/><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">senderAddress</span><span class="hl-1">: </span><span class="hl-9">ChainAddress</span><span class="hl-1"> = </span><span class="hl-5">Wormhole</span><span class="hl-1">.</span><span class="hl-0">chainAddress</span><span class="hl-1">(</span><span class="hl-2">"Ethereum"</span><span class="hl-1">,</span><span class="hl-2">"0xbeef..."</span><span class="hl-1">);</span><br/><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">receiverAddress</span><span class="hl-1">: </span><span class="hl-9">ChainAddress</span><span class="hl-1"> = </span><span class="hl-5">Wormhole</span><span class="hl-1">.</span><span class="hl-0">chainAddress</span><span class="hl-1">(</span><span class="hl-2">"Solana"</span><span class="hl-1">,</span><span class="hl-2">"Sol1111..."</span><span class="hl-1">);</span><br/><br/><span class="hl-3">// Convert the ChainAddress back to its canonical string address format</span><br/><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">strAddress</span><span class="hl-1"> = </span><span class="hl-5">Wormhole</span><span class="hl-1">.</span><span class="hl-0">canonicalAddress</span><span class="hl-1">(</span><span class="hl-5">senderAddress</span><span class="hl-1">); </span><span class="hl-3">// => '0xbeef...'</span><br/><br/><span class="hl-3">// Or if the ethAddr above is for an emitter and you need the UniversalAddress</span><br/><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">emitterAddr</span><span class="hl-1"> = </span><span class="hl-5">ethAddr</span><span class="hl-1">.</span><span class="hl-0">toUniversalAddress</span><span class="hl-1">().</span><span class="hl-0">toString</span><span class="hl-1">()</span>
</code><button>Copy</button></pre>
<a id="md:tokens" class="tsd-anchor"></a><h3><a href="#md:tokens">Tokens</a></h3><p>Similar to the <code>ChainAddress</code> type, the <code>TokenId</code> type provides the Chain and Address of a given Token.</p>
<pre><code class="language-ts"><span class="hl-3">// Returns a TokenId </span><br/><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">sourceToken</span><span class="hl-1">: </span><span class="hl-9">TokenId</span><span class="hl-1"> = </span><span class="hl-5">Wormhole</span><span class="hl-1">.</span><span class="hl-0">tokenId</span><span class="hl-1">(</span><span class="hl-2">"Ethereum"</span><span class="hl-1">,</span><span class="hl-2">"0xbeef..."</span><span class="hl-1">);</span><br/><br/><span class="hl-3">// Whereas the ChainAddress is limited to valid addresses, a TokenId may</span><br/><span class="hl-3">// have the string literal 'native' to consistently denote the native</span><br/><span class="hl-3">// gas token of the chain</span><br/><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">gasToken</span><span class="hl-1">: </span><span class="hl-9">TokenId</span><span class="hl-1"> = </span><span class="hl-5">Wormhole</span><span class="hl-1">.</span><span class="hl-0">tokenId</span><span class="hl-1">(</span><span class="hl-2">"Ethereum"</span><span class="hl-1">,</span><span class="hl-2">"native"</span><span class="hl-1">);</span><br/><br/><span class="hl-3">// the same method can be used to convert the TokenId back to its canonical string address format</span><br/><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">strAddress</span><span class="hl-1"> = </span><span class="hl-5">Wormhole</span><span class="hl-1">.</span><span class="hl-0">canonicalAddress</span><span class="hl-1">(</span><span class="hl-5">senderAddress</span><span class="hl-1">); </span><span class="hl-3">// => '0xbeef...'</span>
</code><button>Copy</button></pre>
<a id="md:signers" class="tsd-anchor"></a><h3><a href="#md:signers">Signers</a></h3><p>In order to sign transactions, an object that fulfils the <code>Signer</code> interface is required. This is a simple interface that can be implemented by wrapping a web wallet or other signing mechanism.</p>
<pre><code class="language-ts"><span class="hl-3">// A Signer is an interface that must be provided to certain methods</span><br/><span class="hl-3">// in the SDK to sign transactions. It can be either a SignOnlySigner</span><br/><span class="hl-3">// or a SignAndSendSigner depending on circumstances.</span><br/><span class="hl-3">// A Signer can be implemented by wrapping an existing offline wallet</span><br/><span class="hl-3">// or a web wallet</span><br/><span class="hl-4">export</span><span class="hl-1"> </span><span class="hl-6">type</span><span class="hl-1"> </span><span class="hl-9">Signer</span><span class="hl-1"> = </span><span class="hl-9">SignOnlySigner</span><span class="hl-1"> | </span><span class="hl-9">SignAndSendSigner</span><span class="hl-1">;</span><br/><br/><span class="hl-3">// A SignOnlySender is for situations where the signer is not</span><br/><span class="hl-3">// connected to the network or does not wish to broadcast the</span><br/><span class="hl-3">// transactions themselves</span><br/><span class="hl-4">export</span><span class="hl-1"> </span><span class="hl-6">interface</span><span class="hl-1"> </span><span class="hl-9">SignOnlySigner</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-0">chain</span><span class="hl-1">(): </span><span class="hl-9">ChainName</span><span class="hl-1">;</span><br/><span class="hl-1"> </span><span class="hl-0">address</span><span class="hl-1">(): </span><span class="hl-9">string</span><span class="hl-1">;</span><br/><span class="hl-1"> </span><span class="hl-3">// Accept an array of unsigned transactions and return</span><br/><span class="hl-1"> </span><span class="hl-3">// an array of signed and serialized transactions.</span><br/><span class="hl-1"> </span><span class="hl-3">// The transactions may be inspected or altered before</span><br/><span class="hl-1"> </span><span class="hl-3">// signing.</span><br/><span class="hl-1"> </span><span class="hl-3">// Note: The serialization is chain specific, if in doubt,</span><br/><span class="hl-1"> </span><span class="hl-3">// see the example implementations linked below</span><br/><span class="hl-1"> </span><span class="hl-0">sign</span><span class="hl-1">(</span><span class="hl-5">tx</span><span class="hl-1">: </span><span class="hl-9">UnsignedTransaction</span><span class="hl-1">[]): </span><span class="hl-9">Promise</span><span class="hl-1"><</span><span class="hl-9">SignedTx</span><span class="hl-1">[]>;</span><br/><span class="hl-1">}</span><br/><br/><span class="hl-3">// A SignAndSendSigner is for situations where the signer is</span><br/><span class="hl-3">// connected to the network and wishes to broadcast the</span><br/><span class="hl-3">// transactions themselves</span><br/><span class="hl-4">export</span><span class="hl-1"> </span><span class="hl-6">interface</span><span class="hl-1"> </span><span class="hl-9">SignAndSendSigner</span><span class="hl-1"> {</span><br/><span class="hl-1"> </span><span class="hl-0">chain</span><span class="hl-1">(): </span><span class="hl-9">ChainName</span><span class="hl-1">;</span><br/><span class="hl-1"> </span><span class="hl-0">address</span><span class="hl-1">(): </span><span class="hl-9">string</span><span class="hl-1">;</span><br/><span class="hl-1"> </span><span class="hl-3">// Accept an array of unsigned transactions and return</span><br/><span class="hl-1"> </span><span class="hl-3">// an array of transaction ids in the same order as the</span><br/><span class="hl-1"> </span><span class="hl-3">// UnsignedTransactions array.</span><br/><span class="hl-1"> </span><span class="hl-0">signAndSend</span><span class="hl-1">(</span><span class="hl-5">tx</span><span class="hl-1">: </span><span class="hl-9">UnsignedTransaction</span><span class="hl-1">[]): </span><span class="hl-9">Promise</span><span class="hl-1"><</span><span class="hl-9">TxHash</span><span class="hl-1">[]>;</span><br/><span class="hl-1">}</span>
</code><button>Copy</button></pre>
<p>See the testing signers (<a href="https://github.com/wormhole-foundation/wormhole-sdk-ts/blob/main/platforms/evm/src/signer.ts">Evm</a>, <a href="https://github.com/wormhole-foundation/wormhole-sdk-ts/blob/main/platforms/solana/src/signer.ts">Solana</a>, ...) for an example of how to implement a signer for a specific chain or platform.</p>
<a id="md:protocols" class="tsd-anchor"></a><h3><a href="#md:protocols">Protocols</a></h3><p>While Wormhole itself is a Generic Message Passing protocol, a number of protocols have been built on top of it to provide specific functionality.</p>
<p>Each Protocol, if available, will have a Platform specific implementation. These implementations provide methods to generate transactions or read state from the contract on-chain.</p>
<a id="md:wormhole-core" class="tsd-anchor"></a><h4><a href="#md:wormhole-core">Wormhole Core</a></h4><p>The protocol that underlies all Wormhole activity is the Core protocol. This protocol is responsible for emitting the message containing the information necessary to perform bridging including <a href="https://docs.wormhole.com/wormhole/reference/glossary#emitter">Emitter address</a>, the <a href="https://docs.wormhole.com/wormhole/reference/glossary#sequence">Sequence number</a> for the message and the Payload of the message itself.</p>
<!--EXAMPLE_CORE_BRIDGE-->
<pre><code class="language-ts"><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">wh</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-0">wormhole</span><span class="hl-1">(</span><span class="hl-2">"Testnet"</span><span class="hl-1">, [</span><span class="hl-5">solana</span><span class="hl-1">]);</span><br/><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">chain</span><span class="hl-1"> = </span><span class="hl-5">wh</span><span class="hl-1">.</span><span class="hl-0">getChain</span><span class="hl-1">(</span><span class="hl-2">"Solana"</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> { </span><span class="hl-7">signer</span><span class="hl-1">, </span><span class="hl-7">address</span><span class="hl-1"> } = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-0">getSigner</span><span class="hl-1">(</span><span class="hl-5">chain</span><span class="hl-1">);</span><br/><br/><span class="hl-1"> </span><span class="hl-3">// Get a reference to the core messaging bridge</span><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">coreBridge</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">chain</span><span class="hl-1">.</span><span class="hl-0">getWormholeCore</span><span class="hl-1">();</span><br/><br/><span class="hl-1"> </span><span class="hl-3">// Generate transactions, sign and send them</span><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">publishTxs</span><span class="hl-1"> = </span><span class="hl-5">coreBridge</span><span class="hl-1">.</span><span class="hl-0">publishMessage</span><span class="hl-1">(</span><br/><span class="hl-1"> </span><span class="hl-3">// Address of sender (emitter in VAA)</span><br/><span class="hl-1"> </span><span class="hl-5">address</span><span class="hl-1">.</span><span class="hl-5">address</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-3">// Message to send (payload in VAA)</span><br/><span class="hl-1"> </span><span class="hl-5">encoding</span><span class="hl-1">.</span><span class="hl-5">bytes</span><span class="hl-1">.</span><span class="hl-0">encode</span><span class="hl-1">(</span><span class="hl-2">"lol"</span><span class="hl-1">),</span><br/><span class="hl-1"> </span><span class="hl-3">// Nonce (user defined, no requirement for a specific value, useful to provide a unique identifier for the message)</span><br/><span class="hl-1"> </span><span class="hl-8">0</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-3">// ConsistencyLevel (ie finality of the message, see wormhole docs for more)</span><br/><span class="hl-1"> </span><span class="hl-8">0</span><span class="hl-1">,</span><br/><span class="hl-1"> );</span><br/><span class="hl-1"> </span><span class="hl-3">// Send the transaction(s) to publish the message</span><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">txids</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-0">signSendWait</span><span class="hl-1">(</span><span class="hl-5">chain</span><span class="hl-1">, </span><span class="hl-5">publishTxs</span><span class="hl-1">, </span><span class="hl-5">signer</span><span class="hl-1">);</span><br/><br/><span class="hl-1"> </span><span class="hl-3">// Take the last txid in case multiple were sent</span><br/><span class="hl-1"> </span><span class="hl-3">// the last one should be the one containing the relevant</span><br/><span class="hl-1"> </span><span class="hl-3">// event or log info</span><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">txid</span><span class="hl-1"> = </span><span class="hl-5">txids</span><span class="hl-1">[</span><span class="hl-5">txids</span><span class="hl-1">.</span><span class="hl-5">length</span><span class="hl-1"> - </span><span class="hl-8">1</span><span class="hl-1">];</span><br/><br/><span class="hl-1"> </span><span class="hl-3">// Grab the wormhole message id from the transaction logs or storage</span><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> [</span><span class="hl-7">whm</span><span class="hl-1">] = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">chain</span><span class="hl-1">.</span><span class="hl-0">parseTransaction</span><span class="hl-1">(</span><span class="hl-5">txid</span><span class="hl-1">!.</span><span class="hl-5">txid</span><span class="hl-1">);</span><br/><br/><span class="hl-1"> </span><span class="hl-3">// Or pull the full message content as an Unsigned VAA</span><br/><span class="hl-1"> </span><span class="hl-3">// const msgs = await coreBridge.parseMessages(txid!.txid);</span><br/><span class="hl-1"> </span><span class="hl-3">// console.log(msgs);</span><br/><br/><span class="hl-1"> </span><span class="hl-3">// Wait for the vaa to be signed and available with a timeout</span><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">vaa</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">wh</span><span class="hl-1">.</span><span class="hl-0">getVaa</span><span class="hl-1">(</span><span class="hl-5">whm</span><span class="hl-1">!, </span><span class="hl-2">"Uint8Array"</span><span class="hl-1">, </span><span class="hl-8">60_000</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-5">vaa</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-3">// Also possible to search by txid but it takes longer to show up</span><br/><span class="hl-1"> </span><span class="hl-3">// console.log(await wh.getVaaByTxHash(txid!.txid, "Uint8Array"));</span><br/><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">verifyTxs</span><span class="hl-1"> = </span><span class="hl-5">coreBridge</span><span class="hl-1">.</span><span class="hl-0">verifyMessage</span><span class="hl-1">(</span><span class="hl-5">address</span><span class="hl-1">.</span><span class="hl-5">address</span><span class="hl-1">, </span><span class="hl-5">vaa</span><span class="hl-1">!);</span><br/><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-0">signSendWait</span><span class="hl-1">(</span><span class="hl-5">chain</span><span class="hl-1">, </span><span class="hl-5">verifyTxs</span><span class="hl-1">, </span><span class="hl-5">signer</span><span class="hl-1">));</span>
</code><button>Copy</button></pre>
<p>See example <a href="https://github.com/wormhole-foundation/wormhole-sdk-ts/blob/main/examples/src/messaging.ts#L7">here</a></p>
<!--EXAMPLE_CORE_BRIDGE-->
<p>Within the payload is the information necessary to perform whatever action is required based on the Protocol that uses it.</p>
<a id="md:token-bridge" class="tsd-anchor"></a><h4><a href="#md:token-bridge">Token Bridge</a></h4><p>The most familiar protocol built on Wormhole is the Token Bridge.</p>
<p>Every chain has a <code>TokenBridge</code> protocol client that provides a consistent interface for interacting with the Token Bridge. This includes methods to generate the transactions required to transfer tokens, as well as methods to generate and redeem attestations.</p>
<p>Using the <code>WormholeTransfer</code> abstractions is the recommended way to interact with these protocols but it is possible to use them directly</p>
<pre><code class="language-ts"><span class="hl-4">import</span><span class="hl-1"> { </span><span class="hl-5">signSendWait</span><span class="hl-1"> } </span><span class="hl-4">from</span><span class="hl-1"> </span><span class="hl-2">"@wormhole-foundation/sdk"</span><span class="hl-1">;</span><br/><br/><span class="hl-3">// ...</span><br/><br/><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">tb</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">srcChain</span><span class="hl-1">.</span><span class="hl-0">getTokenBridge</span><span class="hl-1">(); </span><span class="hl-3">// => TokenBridge<'Evm'></span><br/><br/><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">token</span><span class="hl-1"> = </span><span class="hl-2">"0xdeadbeef..."</span><span class="hl-1">;</span><br/><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">txGenerator</span><span class="hl-1"> = </span><span class="hl-5">tb</span><span class="hl-1">.</span><span class="hl-0">createAttestation</span><span class="hl-1">(</span><span class="hl-5">token</span><span class="hl-1">); </span><span class="hl-3">// => AsyncGenerator<UnsignedTransaction, ...></span><br/><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">txids</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-0">signSendWait</span><span class="hl-1">(</span><span class="hl-5">srcChain</span><span class="hl-1">, </span><span class="hl-5">txGenerator</span><span class="hl-1">, </span><span class="hl-5">src</span><span class="hl-1">.</span><span class="hl-5">signer</span><span class="hl-1">); </span><span class="hl-3">// => TxHash[]</span>
</code><button>Copy</button></pre>
<p>Supported protocols are defined in the <a href="https://github.com/wormhole-foundation/wormhole-sdk-ts/tree/main/core/definitions/src/protocols">definitions module</a>.</p>
<a id="md:transfers" class="tsd-anchor"></a><h2><a href="#md:transfers">Transfers</a></h2><p>While using the <a href="#md:chain-context">ChainContext</a> and <a href="#md:protocols">Protocol</a> clients directly is possible, to do things like transfer tokens, the SDK provides some helpful abstractions.</p>
<p>The <code>WormholeTransfer</code> interface provides a convenient abstraction to encapsulate the steps involved in a cross-chain transfer.</p>
<a id="md:token-transfers" class="tsd-anchor"></a><h3><a href="#md:token-transfers">Token Transfers</a></h3><p>Performing a Token Transfer is trivial for any source and destination chains.</p>
<p>We can create a new <code>Wormhole</code> object and use it to to create <code>TokenTransfer</code>, <code>CircleTransfer</code>, <code>GatewayTransfer</code>, etc. objects to transfer tokens between chains. The transfer object is responsible for tracking the transfer through the process and providing updates on its status.</p>
<!--EXAMPLE_TOKEN_TRANSFER-->
<pre><code class="language-ts"><span class="hl-1"> </span><span class="hl-3">// Create a TokenTransfer object to track the state of the transfer over time</span><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">xfer</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">wh</span><span class="hl-1">.</span><span class="hl-0">tokenTransfer</span><span class="hl-1">(</span><br/><span class="hl-1"> </span><span class="hl-5">route</span><span class="hl-1">.</span><span class="hl-5">token</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">route</span><span class="hl-1">.</span><span class="hl-5">amount</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">route</span><span class="hl-1">.</span><span class="hl-5">source</span><span class="hl-1">.</span><span class="hl-5">address</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">route</span><span class="hl-1">.</span><span class="hl-5">destination</span><span class="hl-1">.</span><span class="hl-5">address</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">route</span><span class="hl-1">.</span><span class="hl-5">delivery</span><span class="hl-1">?.</span><span class="hl-5">automatic</span><span class="hl-1"> ?? </span><span class="hl-6">false</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">route</span><span class="hl-1">.</span><span class="hl-5">payload</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">route</span><span class="hl-1">.</span><span class="hl-5">delivery</span><span class="hl-1">?.</span><span class="hl-5">nativeGas</span><span class="hl-1">,</span><br/><span class="hl-1"> );</span><br/><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">quote</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">TokenTransfer</span><span class="hl-1">.</span><span class="hl-0">quoteTransfer</span><span class="hl-1">(</span><br/><span class="hl-1"> </span><span class="hl-5">wh</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">route</span><span class="hl-1">.</span><span class="hl-5">source</span><span class="hl-1">.</span><span class="hl-5">chain</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">route</span><span class="hl-1">.</span><span class="hl-5">destination</span><span class="hl-1">.</span><span class="hl-5">chain</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">xfer</span><span class="hl-1">.</span><span class="hl-5">transfer</span><span class="hl-1">,</span><br/><span class="hl-1"> );</span><br/><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-5">quote</span><span class="hl-1">);</span><br/><br/><span class="hl-1"> </span><span class="hl-4">if</span><span class="hl-1"> (</span><span class="hl-5">xfer</span><span class="hl-1">.</span><span class="hl-5">transfer</span><span class="hl-1">.</span><span class="hl-5">automatic</span><span class="hl-1"> && </span><span class="hl-5">quote</span><span class="hl-1">.</span><span class="hl-5">destinationToken</span><span class="hl-1">.</span><span class="hl-5">amount</span><span class="hl-1"> < </span><span class="hl-8">0</span><span class="hl-1">)</span><br/><span class="hl-1"> </span><span class="hl-4">throw</span><span class="hl-1"> </span><span class="hl-2">"The amount requested is too low to cover the fee and any native gas requested."</span><span class="hl-1">;</span><br/><br/><span class="hl-1"> </span><span class="hl-3">// 1) Submit the transactions to the source chain, passing a signer to sign any txns</span><br/><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">"Starting transfer"</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">srcTxids</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">xfer</span><span class="hl-1">.</span><span class="hl-0">initiateTransfer</span><span class="hl-1">(</span><span class="hl-5">route</span><span class="hl-1">.</span><span class="hl-5">source</span><span class="hl-1">.</span><span class="hl-5">signer</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">`Started transfer: `</span><span class="hl-1">, </span><span class="hl-5">srcTxids</span><span class="hl-1">);</span><br/><br/><span class="hl-1"> </span><span class="hl-3">// If automatic, we're done</span><br/><span class="hl-1"> </span><span class="hl-4">if</span><span class="hl-1"> (</span><span class="hl-5">route</span><span class="hl-1">.</span><span class="hl-5">delivery</span><span class="hl-1">?.</span><span class="hl-5">automatic</span><span class="hl-1">) </span><span class="hl-4">return</span><span class="hl-1"> </span><span class="hl-5">xfer</span><span class="hl-1">;</span><br/><br/><span class="hl-1"> </span><span class="hl-3">// 2) Wait for the VAA to be signed and ready (not required for auto transfer)</span><br/><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">"Getting Attestation"</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">attestIds</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">xfer</span><span class="hl-1">.</span><span class="hl-0">fetchAttestation</span><span class="hl-1">(</span><span class="hl-8">60_000</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">`Got Attestation: `</span><span class="hl-1">, </span><span class="hl-5">attestIds</span><span class="hl-1">);</span><br/><br/><span class="hl-1"> </span><span class="hl-3">// 3) Redeem the VAA on the dest chain</span><br/><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">"Completing Transfer"</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">destTxids</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">xfer</span><span class="hl-1">.</span><span class="hl-0">completeTransfer</span><span class="hl-1">(</span><span class="hl-5">route</span><span class="hl-1">.</span><span class="hl-5">destination</span><span class="hl-1">.</span><span class="hl-5">signer</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">`Completed Transfer: `</span><span class="hl-1">, </span><span class="hl-5">destTxids</span><span class="hl-1">);</span>
</code><button>Copy</button></pre>
<p>See example <a href="https://github.com/wormhole-foundation/wormhole-sdk-ts/blob/main/examples/src/tokenBridge.ts#L122">here</a></p>
<!--EXAMPLE_TOKEN_TRANSFER-->
<p>Internally, this uses the <a href="#md:token-bridge">TokenBridge</a> protocol client to transfer tokens. The <code>TokenBridge</code> protocol, like other Protocols, provides a consistent set of methods across all chains to generate a set of transactions for that specific chain.</p>
<a id="md:native-usdc-transfers" class="tsd-anchor"></a><h3><a href="#md:native-usdc-transfers">Native USDC Transfers</a></h3><p>We can also transfer native USDC using <a href="https://www.circle.com/en/cross-chain-transfer-protocol">Circle's CCTP</a></p>
<!--EXAMPLE_CCTP_TRANSFER-->
<pre><code class="language-ts"><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">xfer</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">wh</span><span class="hl-1">.</span><span class="hl-0">circleTransfer</span><span class="hl-1">(</span><br/><span class="hl-1"> </span><span class="hl-3">// amount as bigint (base units)</span><br/><span class="hl-1"> </span><span class="hl-5">req</span><span class="hl-1">.</span><span class="hl-5">amount</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-3">// sender chain/address</span><br/><span class="hl-1"> </span><span class="hl-5">src</span><span class="hl-1">.</span><span class="hl-5">address</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-3">// receiver chain/address</span><br/><span class="hl-1"> </span><span class="hl-5">dst</span><span class="hl-1">.</span><span class="hl-5">address</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-3">// automatic delivery boolean</span><br/><span class="hl-1"> </span><span class="hl-5">req</span><span class="hl-1">.</span><span class="hl-5">automatic</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-3">// payload to be sent with the transfer</span><br/><span class="hl-1"> </span><span class="hl-6">undefined</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-3">// If automatic, native gas can be requested to be sent to the receiver</span><br/><span class="hl-1"> </span><span class="hl-5">req</span><span class="hl-1">.</span><span class="hl-5">nativeGas</span><span class="hl-1">,</span><br/><span class="hl-1"> );</span><br/><br/><span class="hl-1"> </span><span class="hl-3">// Note, if the transfer is requested to be Automatic, a fee for performing the relay</span><br/><span class="hl-1"> </span><span class="hl-3">// will be present in the quote. The fee comes out of the amount requested to be sent.</span><br/><span class="hl-1"> </span><span class="hl-3">// If the user wants to receive 1.0 on the destination, the amount to send should be 1.0 + fee.</span><br/><span class="hl-1"> </span><span class="hl-3">// The same applies for native gas dropoff</span><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">quote</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">CircleTransfer</span><span class="hl-1">.</span><span class="hl-0">quoteTransfer</span><span class="hl-1">(</span><span class="hl-5">src</span><span class="hl-1">.</span><span class="hl-5">chain</span><span class="hl-1">, </span><span class="hl-5">dst</span><span class="hl-1">.</span><span class="hl-5">chain</span><span class="hl-1">, </span><span class="hl-5">xfer</span><span class="hl-1">.</span><span class="hl-5">transfer</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">"Quote"</span><span class="hl-1">, </span><span class="hl-5">quote</span><span class="hl-1">);</span><br/><br/><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">"Starting Transfer"</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">srcTxids</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">xfer</span><span class="hl-1">.</span><span class="hl-0">initiateTransfer</span><span class="hl-1">(</span><span class="hl-5">src</span><span class="hl-1">.</span><span class="hl-5">signer</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">`Started Transfer: `</span><span class="hl-1">, </span><span class="hl-5">srcTxids</span><span class="hl-1">);</span><br/><br/><span class="hl-1"> </span><span class="hl-4">if</span><span class="hl-1"> (</span><span class="hl-5">req</span><span class="hl-1">.</span><span class="hl-5">automatic</span><span class="hl-1">) {</span><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">relayStatus</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-0">waitForRelay</span><span class="hl-1">(</span><span class="hl-5">srcTxids</span><span class="hl-1">[</span><span class="hl-5">srcTxids</span><span class="hl-1">.</span><span class="hl-5">length</span><span class="hl-1"> - </span><span class="hl-8">1</span><span class="hl-1">]!);</span><br/><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">`Finished relay: `</span><span class="hl-1">, </span><span class="hl-5">relayStatus</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-4">return</span><span class="hl-1">;</span><br/><span class="hl-1"> }</span><br/><br/><span class="hl-1"> </span><span class="hl-3">// Note: Depending on chain finality, this timeout may need to be increased.</span><br/><span class="hl-1"> </span><span class="hl-3">// See https://developers.circle.com/stablecoin/docs/cctp-technical-reference#mainnet for more</span><br/><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">"Waiting for Attestation"</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">attestIds</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">xfer</span><span class="hl-1">.</span><span class="hl-0">fetchAttestation</span><span class="hl-1">(</span><span class="hl-8">60_000</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">`Got Attestation: `</span><span class="hl-1">, </span><span class="hl-5">attestIds</span><span class="hl-1">);</span><br/><br/><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">"Completing Transfer"</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">dstTxids</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">xfer</span><span class="hl-1">.</span><span class="hl-0">completeTransfer</span><span class="hl-1">(</span><span class="hl-5">dst</span><span class="hl-1">.</span><span class="hl-5">signer</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">`Completed Transfer: `</span><span class="hl-1">, </span><span class="hl-5">dstTxids</span><span class="hl-1">);</span>
</code><button>Copy</button></pre>
<p>See example <a href="https://github.com/wormhole-foundation/wormhole-sdk-ts/blob/main/examples/src/cctp.ts#L81">here</a></p>
<!--EXAMPLE_CCTP_TRANSFER-->
<a id="md:gateway-transfers" class="tsd-anchor"></a><h3><a href="#md:gateway-transfers">Gateway Transfers</a></h3><p>Gateway transfers are transfers that are passed through the Wormhole Gateway to or from Cosmos chains.</p>
<p>A transfer into Cosmos from outside cosmos will be automatically delivered to the destination via IBC from the Gateway chain (fka Wormchain)</p>
<!--EXAMPLE_GATEWAY_INBOUND-->
<pre><code class="language-ts"><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><br/><span class="hl-1"> </span><span class="hl-2">`Beginning transfer into Cosmos from </span><span class="hl-6">${</span><span class="hl-5">src</span><span class="hl-10">.</span><span class="hl-5">chain</span><span class="hl-10">.</span><span class="hl-5">chain</span><span class="hl-6">}</span><span class="hl-2">:</span><span class="hl-6">${</span><span class="hl-5">src</span><span class="hl-10">.</span><span class="hl-5">address</span><span class="hl-10">.</span><span class="hl-5">address</span><span class="hl-10">.</span><span class="hl-0">toString</span><span class="hl-10">()</span><span class="hl-6">}</span><span class="hl-2"> to </span><span class="hl-6">${</span><br/><span class="hl-10"> </span><span class="hl-5">dst</span><span class="hl-10">.</span><span class="hl-5">chain</span><span class="hl-10">.</span><span class="hl-5">chain</span><br/><span class="hl-10"> </span><span class="hl-6">}</span><span class="hl-2">:</span><span class="hl-6">${</span><span class="hl-5">dst</span><span class="hl-10">.</span><span class="hl-5">address</span><span class="hl-10">.</span><span class="hl-5">address</span><span class="hl-10">.</span><span class="hl-0">toString</span><span class="hl-10">()</span><span class="hl-6">}</span><span class="hl-2">`</span><span class="hl-1">,</span><br/><span class="hl-1"> );</span><br/><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">xfer</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">GatewayTransfer</span><span class="hl-1">.</span><span class="hl-0">from</span><span class="hl-1">(</span><span class="hl-5">wh</span><span class="hl-1">, {</span><br/><span class="hl-1"> </span><span class="hl-5">token:</span><span class="hl-1"> </span><span class="hl-5">token</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">amount:</span><span class="hl-1"> </span><span class="hl-5">amount</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">from:</span><span class="hl-1"> </span><span class="hl-5">src</span><span class="hl-1">.</span><span class="hl-5">address</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">to:</span><span class="hl-1"> </span><span class="hl-5">dst</span><span class="hl-1">.</span><span class="hl-5">address</span><span class="hl-1">,</span><br/><span class="hl-1"> } </span><span class="hl-4">as</span><span class="hl-1"> </span><span class="hl-9">GatewayTransferDetails</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">"Created GatewayTransfer: "</span><span class="hl-1">, </span><span class="hl-5">xfer</span><span class="hl-1">.</span><span class="hl-5">transfer</span><span class="hl-1">);</span><br/><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">srcTxIds</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">xfer</span><span class="hl-1">.</span><span class="hl-0">initiateTransfer</span><span class="hl-1">(</span><span class="hl-5">src</span><span class="hl-1">.</span><span class="hl-5">signer</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">"Started transfer on source chain"</span><span class="hl-1">, </span><span class="hl-5">srcTxIds</span><span class="hl-1">);</span><br/><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">attests</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">xfer</span><span class="hl-1">.</span><span class="hl-0">fetchAttestation</span><span class="hl-1">(</span><span class="hl-8">600_000</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">"Got Attestations"</span><span class="hl-1">, </span><span class="hl-5">attests</span><span class="hl-1">);</span>
</code><button>Copy</button></pre>
<p>See example <a href="https://github.com/wormhole-foundation/wormhole-sdk-ts/blob/main/examples/src/cosmos.ts#L120">here</a></p>
<!--EXAMPLE_GATEWAY_INBOUND-->
<p>A transfer within Cosmos will use IBC to transfer from the origin to the Gateway chain, then out from the Gateway to the destination chain</p>
<!--EXAMPLE_GATEWAY_INTERCOSMOS-->
<pre><code class="language-ts"><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><br/><span class="hl-1"> </span><span class="hl-2">`Beginning transfer within cosmos from </span><span class="hl-6">${</span><br/><span class="hl-10"> </span><span class="hl-5">src</span><span class="hl-10">.</span><span class="hl-5">chain</span><span class="hl-10">.</span><span class="hl-5">chain</span><br/><span class="hl-10"> </span><span class="hl-6">}</span><span class="hl-2">:</span><span class="hl-6">${</span><span class="hl-5">src</span><span class="hl-10">.</span><span class="hl-5">address</span><span class="hl-10">.</span><span class="hl-5">address</span><span class="hl-10">.</span><span class="hl-0">toString</span><span class="hl-10">()</span><span class="hl-6">}</span><span class="hl-2"> to </span><span class="hl-6">${</span><span class="hl-5">dst</span><span class="hl-10">.</span><span class="hl-5">chain</span><span class="hl-10">.</span><span class="hl-5">chain</span><span class="hl-6">}</span><span class="hl-2">:</span><span class="hl-6">${</span><span class="hl-5">dst</span><span class="hl-10">.</span><span class="hl-5">address</span><span class="hl-10">.</span><span class="hl-5">address</span><span class="hl-10">.</span><span class="hl-0">toString</span><span class="hl-10">()</span><span class="hl-6">}</span><span class="hl-2">`</span><span class="hl-1">,</span><br/><span class="hl-1"> );</span><br/><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">xfer</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">GatewayTransfer</span><span class="hl-1">.</span><span class="hl-0">from</span><span class="hl-1">(</span><span class="hl-5">wh</span><span class="hl-1">, {</span><br/><span class="hl-1"> </span><span class="hl-5">token:</span><span class="hl-1"> </span><span class="hl-5">token</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">amount:</span><span class="hl-1"> </span><span class="hl-5">amount</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">from:</span><span class="hl-1"> </span><span class="hl-5">src</span><span class="hl-1">.</span><span class="hl-5">address</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">to:</span><span class="hl-1"> </span><span class="hl-5">dst</span><span class="hl-1">.</span><span class="hl-5">address</span><span class="hl-1">,</span><br/><span class="hl-1"> } </span><span class="hl-4">as</span><span class="hl-1"> </span><span class="hl-9">GatewayTransferDetails</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">"Created GatewayTransfer: "</span><span class="hl-1">, </span><span class="hl-5">xfer</span><span class="hl-1">.</span><span class="hl-5">transfer</span><span class="hl-1">);</span><br/><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">srcTxIds</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">xfer</span><span class="hl-1">.</span><span class="hl-0">initiateTransfer</span><span class="hl-1">(</span><span class="hl-5">src</span><span class="hl-1">.</span><span class="hl-5">signer</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">"Started transfer on source chain"</span><span class="hl-1">, </span><span class="hl-5">srcTxIds</span><span class="hl-1">);</span><br/><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">attests</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">xfer</span><span class="hl-1">.</span><span class="hl-0">fetchAttestation</span><span class="hl-1">(</span><span class="hl-8">60_000</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">"Got attests: "</span><span class="hl-1">, </span><span class="hl-5">attests</span><span class="hl-1">);</span>
</code><button>Copy</button></pre>
<p>See example <a href="https://github.com/wormhole-foundation/wormhole-sdk-ts/blob/main/examples/src/cosmos.ts#L152">here</a></p>
<!--EXAMPLE_GATEWAY_INTERCOSMOS-->
<p>A transfer leaving Cosmos will produce a VAA from the Gateway that must be manually redeemed on the destination chain </p>
<!--EXAMPLE_GATEWAY_OUTBOUND-->
<pre><code class="language-ts"><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><br/><span class="hl-1"> </span><span class="hl-2">`Beginning transfer out of cosmos from </span><span class="hl-6">${</span><br/><span class="hl-10"> </span><span class="hl-5">src</span><span class="hl-10">.</span><span class="hl-5">chain</span><span class="hl-10">.</span><span class="hl-5">chain</span><br/><span class="hl-10"> </span><span class="hl-6">}</span><span class="hl-2">:</span><span class="hl-6">${</span><span class="hl-5">src</span><span class="hl-10">.</span><span class="hl-5">address</span><span class="hl-10">.</span><span class="hl-5">address</span><span class="hl-10">.</span><span class="hl-0">toString</span><span class="hl-10">()</span><span class="hl-6">}</span><span class="hl-2"> to </span><span class="hl-6">${</span><span class="hl-5">dst</span><span class="hl-10">.</span><span class="hl-5">chain</span><span class="hl-10">.</span><span class="hl-5">chain</span><span class="hl-6">}</span><span class="hl-2">:</span><span class="hl-6">${</span><span class="hl-5">dst</span><span class="hl-10">.</span><span class="hl-5">address</span><span class="hl-10">.</span><span class="hl-5">address</span><span class="hl-10">.</span><span class="hl-0">toString</span><span class="hl-10">()</span><span class="hl-6">}</span><span class="hl-2">`</span><span class="hl-1">,</span><br/><span class="hl-1"> );</span><br/><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">xfer</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">GatewayTransfer</span><span class="hl-1">.</span><span class="hl-0">from</span><span class="hl-1">(</span><span class="hl-5">wh</span><span class="hl-1">, {</span><br/><span class="hl-1"> </span><span class="hl-5">token:</span><span class="hl-1"> </span><span class="hl-5">token</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">amount:</span><span class="hl-1"> </span><span class="hl-5">amount</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">from:</span><span class="hl-1"> </span><span class="hl-5">src</span><span class="hl-1">.</span><span class="hl-5">address</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">to:</span><span class="hl-1"> </span><span class="hl-5">dst</span><span class="hl-1">.</span><span class="hl-5">address</span><span class="hl-1">,</span><br/><span class="hl-1"> } </span><span class="hl-4">as</span><span class="hl-1"> </span><span class="hl-9">GatewayTransferDetails</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">"Created GatewayTransfer: "</span><span class="hl-1">, </span><span class="hl-5">xfer</span><span class="hl-1">.</span><span class="hl-5">transfer</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">srcTxIds</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">xfer</span><span class="hl-1">.</span><span class="hl-0">initiateTransfer</span><span class="hl-1">(</span><span class="hl-5">src</span><span class="hl-1">.</span><span class="hl-5">signer</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">"Started transfer on source chain"</span><span class="hl-1">, </span><span class="hl-5">srcTxIds</span><span class="hl-1">);</span><br/><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">attests</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">xfer</span><span class="hl-1">.</span><span class="hl-0">fetchAttestation</span><span class="hl-1">(</span><span class="hl-8">600_000</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">"Got attests"</span><span class="hl-1">, </span><span class="hl-5">attests</span><span class="hl-1">);</span><br/><br/><span class="hl-1"> </span><span class="hl-3">// Since we're leaving cosmos, this is required to complete the transfer</span><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">dstTxIds</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">xfer</span><span class="hl-1">.</span><span class="hl-0">completeTransfer</span><span class="hl-1">(</span><span class="hl-5">dst</span><span class="hl-1">.</span><span class="hl-5">signer</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">"Completed transfer on destination chain"</span><span class="hl-1">, </span><span class="hl-5">dstTxIds</span><span class="hl-1">);</span>
</code><button>Copy</button></pre>
<p>See example <a href="https://github.com/wormhole-foundation/wormhole-sdk-ts/blob/main/examples/src/cosmos.ts#L184">here</a></p>
<!--EXAMPLE_GATEWAY_OUTBOUND-->
<a id="md:recovering-transfers" class="tsd-anchor"></a><h3><a href="#md:recovering-transfers">Recovering Transfers</a></h3><p>It may be necessary to recover a transfer that was abandoned before being completed. This can be done by instantiating the Transfer class with the <code>from</code> static method and passing one of several types of identifiers.</p>
<p>A <code>TransactionId</code> or <code>WormholeMessageId</code> may be used to recover the transfer</p>
<!--EXAMPLE_RECOVER_TRANSFER-->
<pre><code class="language-ts"><span class="hl-1"> </span><span class="hl-3">// Rebuild the transfer from the source txid</span><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">xfer</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">CircleTransfer</span><span class="hl-1">.</span><span class="hl-0">from</span><span class="hl-1">(</span><span class="hl-5">wh</span><span class="hl-1">, </span><span class="hl-5">txid</span><span class="hl-1">);</span><br/><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">attestIds</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">xfer</span><span class="hl-1">.</span><span class="hl-0">fetchAttestation</span><span class="hl-1">(</span><span class="hl-8">60</span><span class="hl-1"> * </span><span class="hl-8">60</span><span class="hl-1"> * </span><span class="hl-8">1000</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">"Got attestation: "</span><span class="hl-1">, </span><span class="hl-5">attestIds</span><span class="hl-1">);</span><br/><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">dstTxIds</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">xfer</span><span class="hl-1">.</span><span class="hl-0">completeTransfer</span><span class="hl-1">(</span><span class="hl-5">signer</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">"Completed transfer: "</span><span class="hl-1">, </span><span class="hl-5">dstTxIds</span><span class="hl-1">);</span>
</code><button>Copy</button></pre>
<p>See example <a href="https://github.com/wormhole-foundation/wormhole-sdk-ts/blob/main/examples/src/cctp.ts#L131">here</a></p>
<!--EXAMPLE_RECOVER_TRANSFER-->
<a id="md:routes" class="tsd-anchor"></a><h2><a href="#md:routes">Routes</a></h2><p>While a specific <code>WormholeTransfer</code> may be used (TokenTransfer, CCTPTransfer, ...), it requires the developer know exactly which transfer type to use for a given request. </p>
<p>To provide a more flexible and generic interface, the <code>Wormhole</code> class provides a method to produce a <code>RouteResolver</code> that can be configured with a set of possible routes to be supported.</p>
<!--EXAMPLE_RESOLVER_CREATE-->
<pre><code class="language-ts"><span class="hl-1"> </span><span class="hl-3">// create new resolver, passing the set of routes to consider</span><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">resolver</span><span class="hl-1"> = </span><span class="hl-5">wh</span><span class="hl-1">.</span><span class="hl-0">resolver</span><span class="hl-1">([</span><br/><span class="hl-1"> </span><span class="hl-5">routes</span><span class="hl-1">.</span><span class="hl-5">TokenBridgeRoute</span><span class="hl-1">, </span><span class="hl-3">// manual token bridge</span><br/><span class="hl-1"> </span><span class="hl-5">routes</span><span class="hl-1">.</span><span class="hl-5">AutomaticTokenBridgeRoute</span><span class="hl-1">, </span><span class="hl-3">// automatic token bridge</span><br/><span class="hl-1"> </span><span class="hl-5">routes</span><span class="hl-1">.</span><span class="hl-5">CCTPRoute</span><span class="hl-1">, </span><span class="hl-3">// manual CCTP</span><br/><span class="hl-1"> </span><span class="hl-5">routes</span><span class="hl-1">.</span><span class="hl-5">AutomaticCCTPRoute</span><span class="hl-1">, </span><span class="hl-3">// automatic CCTP</span><br/><span class="hl-1"> </span><span class="hl-5">routes</span><span class="hl-1">.</span><span class="hl-5">AutomaticPorticoRoute</span><span class="hl-1">, </span><span class="hl-3">// Native eth transfers</span><br/><span class="hl-1"> ]);</span>
</code><button>Copy</button></pre>
<p>See example <a href="https://github.com/wormhole-foundation/wormhole-sdk-ts/blob/main/examples/src/router.ts#L30">here</a></p>
<!--EXAMPLE_RESOLVER_CREATE-->
<p>Once created, the resolver can be used to provide a list of input and possible output tokens.</p>
<!--EXAMPLE_RESOLVER_LIST_TOKENS-->
<pre><code class="language-ts"><span class="hl-1"> </span><span class="hl-3">// what tokens are available on the source chain?</span><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">srcTokens</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">resolver</span><span class="hl-1">.</span><span class="hl-0">supportedSourceTokens</span><span class="hl-1">(</span><span class="hl-5">sendChain</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><br/><span class="hl-1"> </span><span class="hl-2">"Allowed source tokens: "</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">srcTokens</span><span class="hl-1">.</span><span class="hl-0">map</span><span class="hl-1">((</span><span class="hl-5">t</span><span class="hl-1">) </span><span class="hl-6">=></span><span class="hl-1"> </span><span class="hl-0">canonicalAddress</span><span class="hl-1">(</span><span class="hl-5">t</span><span class="hl-1">)),</span><br/><span class="hl-1"> );</span><br/><br/><span class="hl-1"> </span><span class="hl-3">// Grab the first one for the example</span><br/><span class="hl-1"> </span><span class="hl-3">// const sendToken = srcTokens[0]!;</span><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">sendToken</span><span class="hl-1"> = </span><span class="hl-5">Wormhole</span><span class="hl-1">.</span><span class="hl-0">tokenId</span><span class="hl-1">(</span><span class="hl-5">sendChain</span><span class="hl-1">.</span><span class="hl-5">chain</span><span class="hl-1">, </span><span class="hl-2">"native"</span><span class="hl-1">);</span><br/><br/><span class="hl-1"> </span><span class="hl-3">// given the send token, what can we possibly get on the destination chain?</span><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">destTokens</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">resolver</span><span class="hl-1">.</span><span class="hl-0">supportedDestinationTokens</span><span class="hl-1">(</span><span class="hl-5">sendToken</span><span class="hl-1">, </span><span class="hl-5">sendChain</span><span class="hl-1">, </span><span class="hl-5">destChain</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><br/><span class="hl-1"> </span><span class="hl-2">"For the given source token and routes configured, the following tokens may be receivable: "</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">destTokens</span><span class="hl-1">.</span><span class="hl-0">map</span><span class="hl-1">((</span><span class="hl-5">t</span><span class="hl-1">) </span><span class="hl-6">=></span><span class="hl-1"> </span><span class="hl-0">canonicalAddress</span><span class="hl-1">(</span><span class="hl-5">t</span><span class="hl-1">)),</span><br/><span class="hl-1"> );</span><br/><span class="hl-1"> </span><span class="hl-3">//grab the first one for the example</span><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">destinationToken</span><span class="hl-1"> = </span><span class="hl-5">destTokens</span><span class="hl-1">[</span><span class="hl-8">0</span><span class="hl-1">]!;</span>
</code><button>Copy</button></pre>
<p>See example <a href="https://github.com/wormhole-foundation/wormhole-sdk-ts/blob/main/examples/src/router.ts#L41">here</a></p>
<!--EXAMPLE_RESOLVER_LIST_TOKENS-->
<p>Once the tokens are selected, a <code>RouteTransferRequest</code> may be created to provide a list of routes that can fulfil the request</p>
<!--EXAMPLE_REQUEST_CREATE-->
<pre><code class="language-ts"><span class="hl-1"> </span><span class="hl-3">// creating a transfer request fetches token details</span><br/><span class="hl-1"> </span><span class="hl-3">// since all routes will need to know about the tokens</span><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">tr</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">routes</span><span class="hl-1">.</span><span class="hl-5">RouteTransferRequest</span><span class="hl-1">.</span><span class="hl-0">create</span><span class="hl-1">(</span><span class="hl-5">wh</span><span class="hl-1">, {</span><br/><span class="hl-1"> </span><span class="hl-5">from:</span><span class="hl-1"> </span><span class="hl-5">sender</span><span class="hl-1">.</span><span class="hl-5">address</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">to:</span><span class="hl-1"> </span><span class="hl-5">receiver</span><span class="hl-1">.</span><span class="hl-5">address</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">source:</span><span class="hl-1"> </span><span class="hl-5">sendToken</span><span class="hl-1">,</span><br/><span class="hl-1"> </span><span class="hl-5">destination:</span><span class="hl-1"> </span><span class="hl-5">destinationToken</span><span class="hl-1">,</span><br/><span class="hl-1"> });</span><br/><br/><span class="hl-1"> </span><span class="hl-3">// resolve the transfer request to a set of routes that can perform it</span><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">foundRoutes</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">resolver</span><span class="hl-1">.</span><span class="hl-0">findRoutes</span><span class="hl-1">(</span><span class="hl-5">tr</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">"For the transfer parameters, we found these routes: "</span><span class="hl-1">, </span><span class="hl-5">foundRoutes</span><span class="hl-1">);</span>
</code><button>Copy</button></pre>
<p>See example <a href="https://github.com/wormhole-foundation/wormhole-sdk-ts/blob/main/examples/src/router.ts#L63">here</a></p>
<!--EXAMPLE_REQUEST_CREATE-->
<p>Choosing the best route is currently left to the developer but strategies might include sorting by output amount or expected time to complete the transfer (no estimate currently provided).</p>
<p>After choosing the best route, extra parameters like <code>amount</code>, <code>nativeGasDropoff</code>, and <code>slippage</code> can be passed, depending on the specific route selected and a quote can be retrieved with the validated request.</p>
<!--EXAMPLE_REQUEST_VALIDATE-->
<pre><code class="language-ts"><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">"This route offers the following default options"</span><span class="hl-1">, </span><span class="hl-5">bestRoute</span><span class="hl-1">.</span><span class="hl-0">getDefaultOptions</span><span class="hl-1">());</span><br/><span class="hl-1"> </span><span class="hl-3">// Specify the amount as a decimal string</span><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">amt</span><span class="hl-1"> = </span><span class="hl-2">"0.001"</span><span class="hl-1">;</span><br/><span class="hl-1"> </span><span class="hl-3">// Create the transfer params for this request</span><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">transferParams</span><span class="hl-1"> = { </span><span class="hl-5">amount:</span><span class="hl-1"> </span><span class="hl-5">amt</span><span class="hl-1">, </span><span class="hl-5">options:</span><span class="hl-1"> { </span><span class="hl-5">nativeGas:</span><span class="hl-1"> </span><span class="hl-8">0</span><span class="hl-1"> } };</span><br/><br/><span class="hl-1"> </span><span class="hl-3">// validate the transfer params passed, this returns a new type of ValidatedTransferParams</span><br/><span class="hl-1"> </span><span class="hl-3">// which (believe it or not) is a validated version of the input params</span><br/><span class="hl-1"> </span><span class="hl-3">// this new var must be passed to the next step, quote</span><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">validated</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">bestRoute</span><span class="hl-1">.</span><span class="hl-0">validate</span><span class="hl-1">(</span><span class="hl-5">transferParams</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-4">if</span><span class="hl-1"> (!</span><span class="hl-5">validated</span><span class="hl-1">.</span><span class="hl-5">valid</span><span class="hl-1">) </span><span class="hl-4">throw</span><span class="hl-1"> </span><span class="hl-5">validated</span><span class="hl-1">.</span><span class="hl-5">error</span><span class="hl-1">;</span><br/><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">"Validated parameters: "</span><span class="hl-1">, </span><span class="hl-5">validated</span><span class="hl-1">.</span><span class="hl-5">params</span><span class="hl-1">);</span><br/><br/><span class="hl-1"> </span><span class="hl-3">// get a quote for the transfer, this too returns a new type that must</span><br/><span class="hl-1"> </span><span class="hl-3">// be passed to the next step, execute (if you like the quote)</span><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">quote</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">bestRoute</span><span class="hl-1">.</span><span class="hl-0">quote</span><span class="hl-1">(</span><span class="hl-5">validated</span><span class="hl-1">.</span><span class="hl-5">params</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-4">if</span><span class="hl-1"> (!</span><span class="hl-5">quote</span><span class="hl-1">.</span><span class="hl-5">success</span><span class="hl-1">) </span><span class="hl-4">throw</span><span class="hl-1"> </span><span class="hl-5">quote</span><span class="hl-1">.</span><span class="hl-5">error</span><span class="hl-1">;</span><br/><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">"Best route quote: "</span><span class="hl-1">, </span><span class="hl-5">quote</span><span class="hl-1">);</span>
</code><button>Copy</button></pre>
<p>See example <a href="https://github.com/wormhole-foundation/wormhole-sdk-ts/blob/main/examples/src/router.ts#L83">here</a></p>
<!--EXAMPLE_REQUEST_VALIDATE-->
<p>Finally, assuming the quote looks good, the route can initiate the request with the quote and the <code>signer</code></p>
<!--EXAMPLE_REQUEST_INITIATE-->
<pre><code class="language-ts"><span class="hl-1"> </span><span class="hl-3">// Now the transfer may be initiated</span><br/><span class="hl-1"> </span><span class="hl-3">// A receipt will be returned, guess what you gotta do with that?</span><br/><span class="hl-1"> </span><span class="hl-6">const</span><span class="hl-1"> </span><span class="hl-7">receipt</span><span class="hl-1"> = </span><span class="hl-4">await</span><span class="hl-1"> </span><span class="hl-5">bestRoute</span><span class="hl-1">.</span><span class="hl-0">initiate</span><span class="hl-1">(</span><span class="hl-5">sender</span><span class="hl-1">.</span><span class="hl-5">signer</span><span class="hl-1">, </span><span class="hl-5">quote</span><span class="hl-1">);</span><br/><span class="hl-1"> </span><span class="hl-5">console</span><span class="hl-1">.</span><span class="hl-0">log</span><span class="hl-1">(</span><span class="hl-2">"Initiated transfer with receipt: "</span><span class="hl-1">, </span><span class="hl-5">receipt</span><span class="hl-1">);</span>
</code><button>Copy</button></pre>
<p>See example <a href="https://github.com/wormhole-foundation/wormhole-sdk-ts/blob/main/examples/src/router.ts#L107">here</a></p>
<!--EXAMPLE_REQUEST_INITIATE-->
<p>Note: See the <code>router.ts</code> example in the examples directory for a full working example</p>
<a id="md:see-also" class="tsd-anchor"></a><h2><a href="#md:see-also">See also</a></h2><p>The tsdoc is available <a href="https://wormhole-foundation.github.io/wormhole-sdk-ts/">here</a></p>
</div></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-index-accordion"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="assets/icons.svg#icon-chevronDown"></use></svg>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><h4 class="uppercase">Member Visibility</h4><form><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-protected" name="protected"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Protected</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-private" name="private"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Private</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li></ul></form></div><div class="tsd-theme-toggle"><h4 class="uppercase">Theme</h4><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-index-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="assets/icons.svg#icon-chevronDown"></use></svg>On This Page</h3></summary><div class="tsd-accordion-details"><a href="#md:wormhole-ts-sdk"><span>Wormhole TS SDK</span></a><ul><li><a href="#md:warning"><span>Warning</span></a></li><li><a href="#md:installation"><span>Installation</span></a></li><li><ul><li><a href="#md:basic"><span>Basic</span></a></li><li><a href="#md:advanced"><span>Advanced</span></a></li></ul></li><li><a href="#md:usage"><span>Usage</span></a></li><li><a href="#md:concepts"><span>Concepts</span></a></li><li><ul><li><a href="#md:platforms"><span>Platforms</span></a></li><li><a href="#md:chain-context"><span>Chain <wbr/>Context</span></a></li><li><a href="#md:addresses"><span>Addresses</span></a></li><li><a href="#md:tokens"><span>Tokens</span></a></li><li><a href="#md:signers"><span>Signers</span></a></li><li><a href="#md:protocols"><span>Protocols</span></a></li><li><ul><li><a href="#md:wormhole-core"><span>Wormhole <wbr/>Core</span></a></li><li><a href="#md:token-bridge"><span>Token <wbr/>Bridge</span></a></li></ul></li></ul></li><li><a href="#md:transfers"><span>Transfers</span></a></li><li><ul><li><a href="#md:token-transfers"><span>Token <wbr/>Transfers</span></a></li><li><a href="#md:native-usdc-transfers"><span>Native USDC <wbr/>Transfers</span></a></li><li><a href="#md:gateway-transfers"><span>Gateway <wbr/>Transfers</span></a></li><li><a href="#md:recovering-transfers"><span>Recovering <wbr/>Transfers</span></a></li></ul></li><li><a href="#md:routes"><span>Routes</span></a></li><li><a href="#md:see-also"><span>See also</span></a></li></ul></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="index.html" class="current"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="assets/icons.svg#icon-1"></use></svg><span>Wormhole TS SDK - v0.7.0</span></a><ul class="tsd-small-nested-navigation" id="tsd-nav-container" data-base="."><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div></body></html>