Skip to content

Commit 047fe0c

Browse files
committed
feat(app): enable transfers from EVM
1 parent 50286f3 commit 047fe0c

File tree

2 files changed

+158
-176
lines changed

2 files changed

+158
-176
lines changed

app/src/lib/components/TransferFrom/components/Cube/faces/Transfer.svelte

Lines changed: 132 additions & 153 deletions
Original file line numberDiff line numberDiff line change
@@ -224,160 +224,139 @@ const transfer = async () => {
224224
return
225225
}
226226
}
227+
} else if (sourceChain.rpc_type === "evm") {
228+
const connectorClient = await getConnectorClient(config)
229+
const selectedChain = evmChainFromChainId(sourceChain.chain_id)
230+
231+
const unionClient = createUnionClient({
232+
account: connectorClient.account,
233+
chainId: sourceChain.chain_id as EvmChainId,
234+
transport: custom(window.ethereum) as unknown as HttpTransport
235+
})
236+
237+
if (!selectedChain) {
238+
toast.error("From chain not found or supported")
239+
return
240+
}
241+
242+
if ($userAddrEvm === null) return toast.error("No Cosmos user address found")
243+
244+
if (window.ethereum === undefined) raise("no ethereum browser extension")
245+
246+
if (stepBefore($transferState, "SWITCHING_TO_CHAIN")) {
247+
transferState.set({ kind: "SWITCHING_TO_CHAIN" })
248+
}
249+
250+
if ($transferState.kind === "SWITCHING_TO_CHAIN") {
251+
if ($transferState.warning) {
252+
transferState.set({ kind: "APPROVING_ASSET" })
253+
transfer()
254+
return
255+
}
256+
// ^ the user is continuing continuing after having seen the warning
257+
258+
try {
259+
await switchChain(config, { chainId: selectedChain.id })
260+
} catch (error) {
261+
if (error instanceof Error) {
262+
transferState.set({ kind: "SWITCHING_TO_CHAIN", warning: error })
263+
}
264+
return
265+
}
266+
transferState.set({ kind: "APPROVING_ASSET" })
267+
}
268+
269+
if ($transferState.kind === "APPROVING_ASSET") {
270+
let hash: `0x${string}` | null = null
271+
272+
try {
273+
const approve = await unionClient.approveErc20(transferArgs)
274+
275+
if (approve.isErr()) throw approve.error
276+
hash = approve.value
277+
} catch (error) {
278+
if (error instanceof Error) {
279+
transferState.set({ kind: "APPROVING_ASSET", error })
280+
}
281+
return
282+
}
283+
transferState.set({ kind: "AWAITING_APPROVAL_RECEIPT", hash })
284+
}
285+
286+
if ($transferState.kind === "AWAITING_APPROVAL_RECEIPT") {
287+
try {
288+
await waitForTransactionReceipt(config, { hash: $transferState.hash })
289+
} catch (error) {
290+
if (error instanceof Error) {
291+
transferState.set({
292+
kind: "AWAITING_APPROVAL_RECEIPT",
293+
hash: $transferState.hash,
294+
error
295+
})
296+
}
297+
return
298+
}
299+
transferState.set({ kind: "SIMULATING_TRANSFER" })
300+
}
301+
302+
if ($transferState.kind === "SIMULATING_TRANSFER") {
303+
console.log("simulating transfer step")
304+
305+
if ($transferState.warning) {
306+
transferState.set({ kind: "CONFIRMING_TRANSFER", contractRequest: null })
307+
transfer()
308+
return
309+
}
310+
311+
// ^ the user is continuing continuing after having seen the warning
312+
313+
console.log("confirming transfers test")
314+
315+
try {
316+
transferState.set({ kind: "CONFIRMING_TRANSFER", contractRequest: null })
317+
} catch (error) {
318+
if (error instanceof Error) {
319+
transferState.set({ kind: "SIMULATING_TRANSFER", warning: error })
320+
}
321+
return
322+
}
323+
}
324+
325+
if ($transferState.kind === "CONFIRMING_TRANSFER") {
326+
try {
327+
const transfer = await unionClient.transferAsset(transferArgs)
328+
if (transfer.isErr()) throw transfer.error
329+
transferState.set({ kind: "AWAITING_TRANSFER_RECEIPT", transferHash: transfer.value })
330+
} catch (error) {
331+
if (error instanceof Error) {
332+
transferState.set({
333+
kind: "CONFIRMING_TRANSFER",
334+
contractRequest: $transferState.contractRequest,
335+
error
336+
})
337+
}
338+
}
339+
}
340+
341+
if ($transferState.kind === "AWAITING_TRANSFER_RECEIPT") {
342+
try {
343+
await waitForTransactionReceipt(config, {
344+
hash: $transferState.transferHash
345+
})
346+
transferState.set({ kind: "TRANSFERRING", transferHash: $transferState.transferHash })
347+
} catch (error) {
348+
if (error instanceof Error) {
349+
transferState.set({
350+
kind: "AWAITING_TRANSFER_RECEIPT",
351+
transferHash: $transferState.transferHash,
352+
error
353+
})
354+
}
355+
}
356+
}
357+
} else {
358+
console.error("invalid rpc type")
227359
}
228-
// else if ($validation.transfer.sourceChain.rpc_type === "evm") {
229-
// const connectorClient = await getConnectorClient(config)
230-
// const selectedChain = evmChainFromChainId($validation.transfer.sourceChain.chain_id)
231-
//
232-
// const unionClient = createUnionClient({
233-
// account: connectorClient.account,
234-
// chainId: $validation.transfer.sourceChain.chain_id as EvmChainId,
235-
// transport: custom(window.ethereum) as unknown as HttpTransport
236-
// })
237-
//
238-
// if (!selectedChain) {
239-
// toast.error("From chain not found or supported")
240-
// return
241-
// }
242-
//
243-
// if ($userAddrEvm === null) return toast.error("No Cosmos user address found")
244-
//
245-
// if (window.ethereum === undefined) raise("no ethereum browser extension")
246-
//
247-
// if (stepBefore($transferState, "SWITCHING_TO_CHAIN")) {
248-
// transferState.set({ kind: "SWITCHING_TO_CHAIN" })
249-
// }
250-
//
251-
// if ($transferState.kind === "SWITCHING_TO_CHAIN") {
252-
// if ($transferState.warning) {
253-
// transferState.set({ kind: "APPROVING_ASSET" })
254-
// transfer()
255-
// return
256-
// }
257-
// // ^ the user is continuing continuing after having seen the warning
258-
//
259-
// try {
260-
// await switchChain(config, { chainId: selectedChain.id })
261-
// } catch (error) {
262-
// if (error instanceof Error) {
263-
// transferState.set({ kind: "SWITCHING_TO_CHAIN", warning: error })
264-
// }
265-
// return
266-
// }
267-
// transferState.set({ kind: "APPROVING_ASSET" })
268-
// }
269-
//
270-
// if ($transferState.kind === "APPROVING_ASSET") {
271-
// let hash: `0x${string}` | null = null
272-
//
273-
// try {
274-
// console.log({
275-
// amount: parsedAmount,
276-
// receiver: $validation.transfer.receiver,
277-
// denomAddress: getAddress($validation.transfer.asset.metadata.denom),
278-
// // TODO: verify chain id is correct
279-
// destinationChainId: $validation.transfer.destinationChain.chain_id as ChainId
280-
// })
281-
//
282-
// const approve = await unionClient.approveTransaction({
283-
// amount: parsedAmount,
284-
// receiver: $validation.transfer.receiver,
285-
// denomAddress: getAddress($validation.transfer.asset.metadata.denom),
286-
// // TODO: verify chain id is correct
287-
// destinationChainId: $validation.transfer.destinationChain.chain_id as ChainId
288-
// })
289-
//
290-
// if (approve.isErr()) throw approve.error
291-
// hash = approve.value
292-
// } catch (error) {
293-
// if (error instanceof Error) {
294-
// transferState.set({ kind: "APPROVING_ASSET", error })
295-
// }
296-
// return
297-
// }
298-
// transferState.set({ kind: "AWAITING_APPROVAL_RECEIPT", hash })
299-
// }
300-
//
301-
// if ($transferState.kind === "AWAITING_APPROVAL_RECEIPT") {
302-
// try {
303-
// await waitForTransactionReceipt(config, { hash: $transferState.hash })
304-
// } catch (error) {
305-
// if (error instanceof Error) {
306-
// transferState.set({
307-
// kind: "AWAITING_APPROVAL_RECEIPT",
308-
// hash: $transferState.hash,
309-
// error
310-
// })
311-
// }
312-
// return
313-
// }
314-
// transferState.set({ kind: "SIMULATING_TRANSFER" })
315-
// }
316-
//
317-
// if ($transferState.kind === "SIMULATING_TRANSFER") {
318-
// console.log("simulating transfer step")
319-
//
320-
// if ($transferState.warning) {
321-
// transferState.set({ kind: "CONFIRMING_TRANSFER", contractRequest: null })
322-
// transfer()
323-
// return
324-
// }
325-
//
326-
// // ^ the user is continuing continuing after having seen the warning
327-
//
328-
// console.log("confirming transfers test")
329-
//
330-
// try {
331-
// transferState.set({ kind: "CONFIRMING_TRANSFER", contractRequest: null })
332-
// } catch (error) {
333-
// if (error instanceof Error) {
334-
// transferState.set({ kind: "SIMULATING_TRANSFER", warning: error })
335-
// }
336-
// return
337-
// }
338-
// }
339-
//
340-
// if ($transferState.kind === "CONFIRMING_TRANSFER") {
341-
// try {
342-
// const transfer = await unionClient.transferAsset({
343-
// autoApprove: false,
344-
// amount: parsedAmount,
345-
// receiver: $validation.transfer.receiver,
346-
// denomAddress: getAddress($validation.transfer.asset.metadata.denom),
347-
// destinationChainId: $validation.transfer.destinationChain.chain_id as ChainId
348-
// })
349-
// if (transfer.isErr()) throw transfer.error
350-
// transferState.set({ kind: "AWAITING_TRANSFER_RECEIPT", transferHash: transfer.value })
351-
// } catch (error) {
352-
// if (error instanceof Error) {
353-
// transferState.set({
354-
// kind: "CONFIRMING_TRANSFER",
355-
// contractRequest: $transferState.contractRequest,
356-
// error
357-
// })
358-
// }
359-
// }
360-
// }
361-
//
362-
// if ($transferState.kind === "AWAITING_TRANSFER_RECEIPT") {
363-
// try {
364-
// await waitForTransactionReceipt(config, {
365-
// hash: $transferState.transferHash
366-
// })
367-
// transferState.set({ kind: "TRANSFERRING", transferHash: $transferState.transferHash })
368-
// } catch (error) {
369-
// if (error instanceof Error) {
370-
// transferState.set({
371-
// kind: "AWAITING_TRANSFER_RECEIPT",
372-
// transferHash: $transferState.transferHash,
373-
// error
374-
// })
375-
// }
376-
// }
377-
// }
378-
// } else {
379-
//console.error("invalid rpc type")
380-
//}
381360
382361
if ($transferState.kind === "TRANSFERRING") {
383362
await sleep(REDIRECT_DELAY_MS)

site/src/components/EmailSignup.astro

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,56 @@
11
<script is:inline>
22
/** @param {Event} event */
3-
const handleSubmit = async event => {
4-
event.preventDefault()
3+
const handleSubmit = async (event) => {
4+
event.preventDefault();
55

66
// @ts-ignore
7-
const email = event.target.email.value
7+
const email = event.target.email.value;
88
const payload = {
99
email,
10-
audienceId: 'fce6d558-d118-4071-ae77-6b8b141550bd',
11-
}
10+
audienceId: "fce6d558-d118-4071-ae77-6b8b141550bd",
11+
};
1212

1313
try {
1414
const response = await fetch(
15-
'https://uorqzpuryrgfnecadajo.supabase.co/functions/v1/email-signup',
15+
"https://uorqzpuryrgfnecadajo.supabase.co/functions/v1/email-signup",
1616
{
17-
method: 'POST',
17+
method: "POST",
1818
headers: {
19-
'Content-Type': 'application/json',
19+
"Content-Type": "application/json",
2020
},
2121
body: JSON.stringify(payload),
2222
},
23-
)
23+
);
2424

2525
if (response.ok) {
26-
console.log('Form submitted successfully')
27-
const thanks = `<h3 class="font-supermolot text-lg font-bold uppercase !m-0 !p-0">Thanks for signing up!</h3>`
28-
const div = document.querySelector('div[data-signup-form=""]')
29-
if (!div) return
26+
console.log("Form submitted successfully");
27+
const thanks = `<h3 class="font-supermolot text-lg font-bold uppercase !m-0 !p-0">Thanks for signing up!</h3>`;
28+
const div = document.querySelector('div[data-signup-form=""]');
29+
if (!div) return;
3030

31-
console.info(div)
32-
div.innerHTML = thanks
31+
console.info(div);
32+
div.innerHTML = thanks;
3333
} else {
34-
console.error('Failed to submit form', await response.text())
34+
console.error("Failed to submit form", await response.text());
3535
}
3636
} catch (error) {
37-
console.error('An error occurred', error)
37+
console.error("An error occurred", error);
3838
}
39-
}
39+
};
4040

4141
// Add the event listener to the form on client load
42-
document.addEventListener('DOMContentLoaded', () => {
43-
const form = document.querySelector('form')
42+
document.addEventListener("DOMContentLoaded", () => {
43+
const form = document.querySelector("form");
4444
if (form) {
45-
form.addEventListener('submit', handleSubmit)
45+
form.addEventListener("submit", handleSubmit);
4646
}
47-
})
47+
});
4848
</script>
4949

50-
<div class="size-full flex flex-col items-center justify-center space-y-4" data-signup-form>
50+
<div
51+
class="size-full flex flex-col items-center justify-center space-y-4"
52+
data-signup-form
53+
>
5154
<h3 class="font-supermolot text-lg font-bold uppercase !m-0 !p-0">
5255
Follow the latest developments
5356
</h3>

0 commit comments

Comments
 (0)