A web component custom element that can be embedded in any frontend application, or even plain HTML/JS/CSS. Using the full strength of the SDK, the widget can provide swap operations from any other custom dApp, wallet, etc.
Installation
yarnadd@pontem/liquidswap-widget
or
npminstall@pontem/liquidswap-widget
Usage
Function loadWidget accepts widget HTML tag name as string. It can be custom name but must be in kebab case. We recommend to use liquidswap-widget name. Passed name must be exactly the same as tag name.
Properties should be passed as strings (data-attributes), so to pass Object variable you need to use JSON.stringify() on passing Object.
Properties will be extruded with JSON.parse() inside widget;
Properties are reactive, so any change to props will update widget’s internal store;
Also, widget will dispatch to Custom Events:
‘signAndSubmitTransaction’ - this event will return CustomEvent with ‘detail’ property containing ready for wallet transaction payload. Just accept props inside handler and you will find prop ‘detail’ with full transaction payload;
‘transactionProcessed’ - this event will be fired after widget accepts hash and status of transaction and correctly resolves it with.
Example in React-JSX
import React, { useLayoutEffect, useRef, useState } from'react';import { loadWidget } from'@pontem/liquidswap-widget';exportconstWidget= () => {const [dataNetwork,setDataNetwork] =useState( { name:'mainnet', chainId:'1' } );const [dataAccount,setDataAccount] =useState('0x019b68599dd727829dfc5036dec02464abeacdf76e5d17ce43352533b1b212b8' );const [transactionStatus,setTransactionStatus] =useState<{ status:string, hash:string|null }>({ status:'pending', hash:null });constref=useRef();consttransactionHandler= (props:CustomEvent) => {// props.detail will be contain payload. };constprocessedHandler= (event:CustomEvent) => {// this event will be fired when user close modal with transaction status// neither it's success or error. After that point we do not need to // provide hash or status. So it should be set to initial State: setTransactionStatus({ status:'pending', hash:null }); };useLayoutEffect(() => {loadWidget('liquidswap-widget');// customElements available as window.customElements customElements.whenDefined('liquidswap-widget').then(() => {if (ref.current) {constnodeElement=ref.current asunknownasElement;nodeElement.addEventListener('signAndSubmitTransaction', transactionHandler );nodeElement.addEventListener('transactionProcessed', processedHandler ); } }); }, []);return ( <liquidswap-widgetref={ref}data-network={JSON.stringify(dataNetwork)}data-account={dataAccount}data-transaction={JSON.stringify(transactionStatus)} /> )};
Note: When this properties are passed to widget - it treats Parent element as ‘wallet environment’, so connect / disconnect wallet flow will be skipped / hidden.