Example

//this is an example of MetaMask web extension.
....
<!--import basic data of Ethereum contract, include abi & contract address.-->
<script src="eth-contract.js"></script>
<!--import ExtensionProxy-->
<script src="sealsc-web-extension-proxy.js"></script>
<!--import MetaMask wrapper which conform Seal SC web extension protocol-->
<script src="./sealsc-web-extension/sealsc-web-extension-metamask.js"></script>
....
async function loadAndTest() {
    //load MetaMask wrapper to proxy
    metamaskProxy = await sealscWebExtensionProxy
                            .load(sealscWebExtensionMetamask.metamask)
                            .then(p=>p.data)

    //do the test
    proxyTest(metamaskProxy, {
            receiver: "A Ethereum address to receive test tokens.",
            contractData: {
              abi: ethAbi,
              address: ethContractAddress,
            },
            transferData: {
              amount: 1,
              memo: '',
              extra: null
            },
            transferTokenData: {
              amount: 1.2
            },
            offChainData: {
              method: "decimals"
            }
          })
        }
  }

async function proxyTest(proxy, data) {
    let receiver = data.receiver
    let contractData = data.contractData

    let transferData = data.transferData
    let transferTokenData = data.transferTokenData
    let offChainData = data.offChainData

    let loginCheck = await proxy.isLogin()

    console.log("login: ", loginCheck)
    if(!loginCheck.data) {
      let link = await proxy.link()
      console.log("link: ", link)
      if(!link.data) {
        console.log("need login")
        return
      }
    }

    let transferResult = await proxy.transfer(receiver, transferData.amount, transferData.memo, transferData.extra)
    console.log("transfer: ", transferResult)

    let contractLoadResult = await proxy.loadContract(contractData.abi, contractData.address)
    console.log("contract: ", contractLoadResult)
    if(!contractLoadResult.data) {
      console.log("contract load failed")
      return
    }

    let contractWrapper = contractLoadResult.data
    let transferTokenResult = await proxy.transferToken(contractWrapper, receiver, transferTokenData.amount,  transferTokenData.extra)
    console.log("transfer token: ", transferTokenResult)

    let offChainCallResult = await proxy.offChainCall(contractWrapper, offChainData.method)
    console.log("off chain call: ", offChainCallResult)
  }

This example is using MetaMask Wrapper sealsc-web-extension-metamask.