-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
8 changed files
with
1,425 additions
and
45 deletions.
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,239 @@ | ||
<!DOCTYPE html> | ||
<html> | ||
<head> | ||
<meta charset="utf-8" /> | ||
<link rel="stylesheet" href="/index-64996518a208382e.css" integrity="sha384-Lb9Y/fX3qtHtIiM9q+0Ro67r1xcpm3s6M/rj+51wMp27/fVIrtUVcF30dF0WLh3x"/> | ||
<script nonce="ujW4VoOxKBG3H07d8mXPPw==">/** | ||
* The `@polkadot/extension-dapp` package can be dynamically imported. | ||
* Usually it is wise to use a package manager like npm or yarn to install it as a dependency. | ||
* | ||
* The `getPolkadotJsExtensionMod` closure returns the `@polkadot/extension-dapp` module on demand. | ||
*/ | ||
let getPolkadotJsExtensionMod = (() => { | ||
let mod = null; | ||
|
||
// initialize `@polkadot/extension-dapp` module on page load | ||
let initPromise = (async () => { | ||
mod = await import( | ||
"https://cdn.jsdelivr.net/npm/@polkadot/extension-dapp@0.46.3/+esm" | ||
); | ||
})(); | ||
|
||
// return a function that waits for initialization to be finished, in case mod is not initialized yet. | ||
return async () => { | ||
if (mod == null) { | ||
await initPromise; | ||
} | ||
return mod; | ||
}; | ||
})(); | ||
|
||
/** | ||
* Queries wallets from browser extensions like Talisman and the Polkadot.js extension for user accounts. | ||
* | ||
* @returns a json string that contains all the accounts that were found. | ||
*/ | ||
async function getAccounts() { | ||
const extensionMod = await getPolkadotJsExtensionMod(); | ||
await extensionMod.web3Enable("Subxt Example App"); | ||
const allAccounts = await extensionMod.web3Accounts(); | ||
const accountObjects = allAccounts.map((account) => ({ | ||
name: account.meta.name, // e.g. "Alice" | ||
source: account.meta.source, // e.g. "talisman", "polkadot-js" | ||
ty: account.type, // e.g. "sr25519" | ||
address: account.address // e.g. "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY" | ||
})); | ||
console.log(accountObjects); | ||
return JSON.stringify(accountObjects); | ||
} | ||
|
||
/** | ||
* Signs a payload via browser extension | ||
* | ||
* @param payloadAsStr a string representing a JSON object like this: | ||
* let payload = { | ||
* "specVersion": "0x000024d6", | ||
* "transactionVersion": "0x00000018", | ||
* "address": "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY", | ||
* "blockHash": "0xd7aad6185db012b7ffbce710b55234d6c9589170566b925ee50cfa3d7f1e6f8f", | ||
* "blockNumber": "0x00000000", | ||
* "era": "0x0000", | ||
* "genesisHash": "0xd7aad6185db012b7ffbce710b55234d6c9589170566b925ee50cfa3d7f1e6f8f", | ||
* "method": "0x0503001cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c0b00c465f14670", | ||
* "nonce": "0x00000000", | ||
* "signedExtensions": [ | ||
* "CheckNonZeroSender", | ||
* "CheckSpecVersion", | ||
* "CheckTxVersion", | ||
* "CheckGenesis", | ||
* "CheckMortality", | ||
* "CheckNonce", | ||
* "CheckWeight", | ||
* "ChargeTransactionPayment", | ||
* "PrevalidateAttests" | ||
* ], | ||
* "tip": "0x00000000000000000000000000000000", | ||
* "version": 4 | ||
* }; | ||
* @param source the extension used for signing as a string | ||
* @param address the ss58 encoded address as a string | ||
* @returns {Promise<*>} | ||
*/ | ||
async function signPayload(payloadAsStr, source, address) { | ||
let payload = JSON.parse(payloadAsStr); | ||
const extensionMod = await getPolkadotJsExtensionMod(); | ||
const injector = await extensionMod.web3FromSource(source); | ||
const signPayload = injector?.signer?.signPayload; | ||
if (!!signPayload) { | ||
const {signature} = await signPayload(payload); | ||
console.log("signature js:", signature) | ||
return signature; | ||
} else { | ||
throw "The extension's injector does not have a `signPayload` function on its `signer`"; | ||
} | ||
} | ||
</script> | ||
<title>Polkadot Utils</title> | ||
<link rel="modulepreload" href="/polkadot_utils-8518327d0f0d5a49.js" crossorigin=anonymous integrity="sha384-t9mY9bYSccsEsbabM4e89N/EwrWhkdPSIpNiDa60iCgKK2wkF0xzEzzgD3LIoNLb"><link rel="preload" href="/polkadot_utils-8518327d0f0d5a49_bg.wasm" crossorigin=anonymous integrity="sha384-ZNv2rgWgD654AnBmclmbrYk7BWBk3/jVEnfJJq8H/H/IKAmUdBg1S8TNf5eahKf2" as="fetch" type="application/wasm"></head> | ||
<body> | ||
<script type="module" nonce="AL9U0a8YwAFtW7wgZFskFQ=="> | ||
import init, * as bindings from '/polkadot_utils-8518327d0f0d5a49.js'; | ||
const wasm = await init('/polkadot_utils-8518327d0f0d5a49_bg.wasm'); | ||
|
||
|
||
window.wasmBindings = bindings; | ||
|
||
|
||
dispatchEvent(new CustomEvent("TrunkApplicationStarted", {detail: {wasm}})); | ||
|
||
</script><script>"use strict"; | ||
|
||
(function () { | ||
|
||
const address = '{{__TRUNK_ADDRESS__}}'; | ||
const base = '{{__TRUNK_WS_BASE__}}'; | ||
let protocol = ''; | ||
protocol = | ||
protocol | ||
? protocol | ||
: window.location.protocol === 'https:' | ||
? 'wss' | ||
: 'ws'; | ||
const url = protocol + '://' + address + base + '.well-known/trunk/ws'; | ||
|
||
class Overlay { | ||
constructor() { | ||
// create an overlay | ||
this._overlay = document.createElement("div"); | ||
const style = this._overlay.style; | ||
style.height = "100vh"; | ||
style.width = "100vw"; | ||
style.position = "fixed"; | ||
style.top = "0"; | ||
style.left = "0"; | ||
style.backgroundColor = "rgba(222, 222, 222, 0.5)"; | ||
style.fontFamily = "sans-serif"; | ||
// not sure that's the right approach | ||
style.zIndex = "1000000"; | ||
style.backdropFilter = "blur(1rem)"; | ||
|
||
const container = document.createElement("div"); | ||
// center it | ||
container.style.position = "absolute"; | ||
container.style.top = "30%"; | ||
container.style.left = "15%"; | ||
container.style.maxWidth = "85%"; | ||
|
||
this._title = document.createElement("div"); | ||
this._title.innerText = "Build failure"; | ||
this._title.style.paddingBottom = "2rem"; | ||
this._title.style.fontSize = "2.5rem"; | ||
|
||
this._message = document.createElement("div"); | ||
this._message.style.whiteSpace = "pre-wrap"; | ||
|
||
const icon= document.createElement("div"); | ||
icon.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" fill="#dc3545" viewBox="0 0 16 16"><path d="M8.982 1.566a1.13 1.13 0 0 0-1.96 0L.165 13.233c-.457.778.091 1.767.98 1.767h13.713c.889 0 1.438-.99.98-1.767L8.982 1.566zM8 5c.535 0 .954.462.9.995l-.35 3.507a.552.552 0 0 1-1.1 0L7.1 5.995A.905.905 0 0 1 8 5zm.002 6a1 1 0 1 1 0 2 1 1 0 0 1 0-2z"/></svg>'; | ||
this._title.prepend(icon); | ||
|
||
container.append(this._title, this._message); | ||
this._overlay.append(container); | ||
|
||
this._inject(); | ||
window.setInterval(() => { | ||
this._inject(); | ||
}, 250); | ||
} | ||
|
||
set reason(reason) { | ||
this._message.textContent = reason; | ||
} | ||
|
||
_inject() { | ||
if (!this._overlay.isConnected) { | ||
// prepend it | ||
document.body?.prepend(this._overlay); | ||
} | ||
} | ||
|
||
} | ||
|
||
class Client { | ||
constructor(url) { | ||
this.url = url; | ||
this.poll_interval = 5000; | ||
this._overlay = null; | ||
} | ||
|
||
start() { | ||
const ws = new WebSocket(this.url); | ||
ws.onmessage = (ev) => { | ||
const msg = JSON.parse(ev.data); | ||
switch (msg.type) { | ||
case "reload": | ||
this.reload(); | ||
break; | ||
case "buildFailure": | ||
this.buildFailure(msg.data) | ||
break; | ||
} | ||
}; | ||
ws.onclose = this.onclose; | ||
} | ||
|
||
onclose() { | ||
window.setTimeout( | ||
() => { | ||
// when we successfully reconnect, we'll force a | ||
// reload (since we presumably lost connection to | ||
// trunk due to it being killed, so it will have | ||
// rebuilt on restart) | ||
const ws = new WebSocket(this.url); | ||
ws.onopen = () => window.location.reload(); | ||
ws.onclose = this.onclose; | ||
}, | ||
this.poll_interval); | ||
} | ||
|
||
reload() { | ||
window.location.reload(); | ||
} | ||
|
||
buildFailure({reason}) { | ||
// also log the console | ||
console.error("Build failed:", reason); | ||
|
||
console.debug("Overlay", this._overlay); | ||
|
||
if (!this._overlay) { | ||
this._overlay = new Overlay(); | ||
} | ||
this._overlay.reason = reason; | ||
} | ||
} | ||
|
||
new Client(url).start(); | ||
|
||
})() | ||
</script></body> | ||
</html> |
Oops, something went wrong.