diff --git a/package.json b/package.json index 6f6fd7ba..9c3fe469 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "os-locale": "3.0.0" }, "devDependencies": { - "electron": "22.0.0", + "electron": "22.0.2", "electron-builder": "23.6.0", "electron-packager": "17.1.1", "@electron/notarize": "1.2.3", diff --git a/qortal-ui-core/language/us.json b/qortal-ui-core/language/us.json index 9bbc4fd1..37e9f077 100644 --- a/qortal-ui-core/language/us.json +++ b/qortal-ui-core/language/us.json @@ -568,7 +568,9 @@ "cchange59": "TIP USER", "cchange60": "Group Invites Pending", "cchange61": "Error when fetching group invites. Please try again!", - "cchange62": "Wrong Username and Address Inputted! Please try again!" + "cchange62": "Wrong Username and Address Inputted! Please try again!", + "cchange63": "Please enter a recipient" + }, "welcomepage": { "wcchange1": "Welcome to Q-Chat", diff --git a/qortal-ui-core/package.json b/qortal-ui-core/package.json index ba56c34c..e98948c6 100644 --- a/qortal-ui-core/package.json +++ b/qortal-ui-core/package.json @@ -68,13 +68,12 @@ "bcryptjs": "2.4.3", "epml": "0.3.3", "file-saver": "2.0.5", - "lit": "2.6.0", + "lit": "2.6.1", "lit-translate": "2.0.1", "pwa-helpers": "0.9.1", - "random-sentence-generator": "0.0.8", "redux": "4.2.0", "redux-thunk": "2.4.2", - "rollup": "3.9.1", + "rollup": "3.10.0", "rollup-plugin-node-globals": "1.4.0", "rollup-plugin-progress": "1.1.2", "rollup-plugin-scss": "3.0.0", diff --git a/qortal-ui-core/src/components/login-view/create-account-section.js b/qortal-ui-core/src/components/login-view/create-account-section.js index b285118f..48c27985 100644 --- a/qortal-ui-core/src/components/login-view/create-account-section.js +++ b/qortal-ui-core/src/components/login-view/create-account-section.js @@ -4,11 +4,13 @@ import { store } from '../../store.js' import { use, get, translate, translateUnsafeHTML, registerTranslateConfig } from 'lit-translate' import { createWallet } from '../../../../qortal-ui-crypto/api/createWallet.js' -import FileSaver from 'file-saver' import { doLogin, doLogout, doSelectAddress } from '../../redux/app/app-actions.js' import { doStoreWallet } from '../../redux/user/user-actions.js' import { checkApiKey } from '../../apiKeyUtils.js' +import FileSaver from 'file-saver' +import ripple from '../../functional-components/loading-ripple.js' import snackbar from '../../functional-components/snackbar.js' +import '../../functional-components/random-sentence-generator.js' import '@material/mwc-button' import '@material/mwc-checkbox' import '@material/mwc-textfield' @@ -22,8 +24,6 @@ import '@polymer/paper-input/paper-input.js' import '@polymer/paper-tooltip/paper-tooltip.js' import '@vaadin/text-field/vaadin-text-field.js' import '@vaadin/password-field/vaadin-password-field.js' -import 'random-sentence-generator' -import ripple from '../../functional-components/loading-ripple.js' let lastPassword = '' @@ -393,17 +393,17 @@ class CreateAccountSection extends connect(store)(LitElement) {
diff --git a/qortal-ui-core/src/functional-components/random-sentence-generator.js b/qortal-ui-core/src/functional-components/random-sentence-generator.js new file mode 100644 index 00000000..b9482fb5 --- /dev/null +++ b/qortal-ui-core/src/functional-components/random-sentence-generator.js @@ -0,0 +1,160 @@ +// Author: irontiga + +'use strict' +import { LitElement, html, css } from 'lit' +import * as WORDLISTS from './wordlists.js' + +class RandomSentenceGenerator extends LitElement { + static get properties() { + return { + template: { + type: String, + attribute: 'template' + }, + parsedString: { + type: String + }, + fetchedWordlistCount: { + type: Number, + value: 0 + }, + capitalize: { + type: Boolean + }, + partsOfSpeechMap: { + type: Object + }, + templateEntropy: { + type: Number, + reflect: true, + attribute: 'template-entropy' + }, + maxWordLength: { + type: Number, + attribute: 'max-word-length' + } + } + } + + constructor() { + super() + this.template = 'adjective noun verb adverb.' + this.maxWordLength = 0 + this.parsedString = '' + this.fetchedWordlistCount = 0 + this.capitalize = true + this.partsOfSpeechMap = { + 'noun': 'nouns', + 'adverb': 'adverbs', + 'adv': 'adverbs', + 'verb': 'verbs', + 'interjection': 'interjections', + 'adjective': 'adjectives', + 'adj': 'adjectives', + 'verbed': 'verbed' + } + this.partsOfSpeech = Object.keys(this.partsOfSpeechMap) + this._wordlists = WORDLISTS + } + + updated(changedProperties) { + let regen = false + if (changedProperties.has('template')) { + regen = true + } + if (changedProperties.has('maxWordLength')) { + console.dir(this.maxWordLength) + if (this.maxWordLength) { + const wl = { ...this._wordlists } + for (const partOfSpeech in this._wordlists) { + console.log(this._wordlists[partOfSpeech]) + if (Array.isArray(this._wordlists[partOfSpeech])) { + wl[partOfSpeech] = this._wordlists[partOfSpeech].filter(word => word.length <= this.maxWordLength) + } + } + this._wordlists = wl + } + regen = true + } + if (regen) this.generate() + } + + _RNG(entropy) { + if (entropy > 1074) { + throw new Error('Javascript can not handle that much entropy!') + } + let randNum = 0 + const crypto = window.crypto || window.msCrypto + + if (crypto) { + const entropy256 = Math.ceil(entropy / 8) + + let buffer = new Uint8Array(entropy256) + crypto.getRandomValues(buffer) + + randNum = buffer.reduce((num, value) => { + return num * value + }, 1) / Math.pow(256, entropy256) + } else { + console.warn('Secure RNG not found. Using Math.random') + randNum = Math.random() + } + return randNum + } + + setRNG(fn) { + this._RNG = fn + } + + _captitalize(str) { + return str.charAt(0).toUpperCase() + str.slice(1) + } + + getWord(partOfSpeech) { + const words = this._wordlists[this.partsOfSpeechMap[partOfSpeech]] + const requiredEntropy = Math.log(words.length) / Math.log(2) + const index = this._RNG(requiredEntropy) * words.length + + return { + word: words[Math.round(index)], + entropy: words.length + } + } + + generate() { + this.parsedString = this.parse(this.template) + } + + parse(template) { + const split = template.split(/[\s]/g) + let entropy = 1 + const final = split.map(word => { + const lower = word.toLowerCase() + + this.partsOfSpeech.some(partOfSpeech => { + const partOfSpeechIndex = lower.indexOf(partOfSpeech) // Check it exists + const nextChar = word.charAt(partOfSpeech.length) + + if (partOfSpeechIndex === 0 && !(nextChar && (nextChar.match(/[a-zA-Z]/g) != null))) { + const replacement = this.getWord(partOfSpeech) + word = replacement.word + word.slice(partOfSpeech.length) // Append the rest of the "word" (punctuation) + entropy = entropy * replacement.entropy + return true + } + }) + return word + }) + this.templateEntropy = Math.floor(Math.log(entropy) / Math.log(8)) + return final.join(' ') + } + + render() { + return html` + ${this.parsedString} + ` + } +} + +customElements.define('random-sentence-generator', RandomSentenceGenerator) + +export default RandomSentenceGenerator diff --git a/qortal-ui-core/src/functional-components/verb-past-tense.js b/qortal-ui-core/src/functional-components/verb-past-tense.js new file mode 100644 index 00000000..198e80e9 --- /dev/null +++ b/qortal-ui-core/src/functional-components/verb-past-tense.js @@ -0,0 +1,36 @@ +// Sourced from https://gist.github.com/letsgetrandy/1e05a68ea74ba6736eb5 + +export const EXCEPTIONS = { + 'are': 'were', + 'eat': 'ate', + 'go': 'went', + 'have': 'had', + 'inherit': 'inherited', + 'is': 'was', + 'run': 'ran', + 'sit': 'sat', + 'visit': 'visited' +} + +export const getPastTense = (verb, exceptions = EXCEPTIONS) => { + if (exceptions[verb]) { + return exceptions[verb] + } + if ((/e$/i).test(verb)) { + return verb + 'd' + } + if ((/[aeiou]c$/i).test(verb)) { + return verb + 'ked' + } + // for american english only + if ((/el$/i).test(verb)) { + return verb + 'ed' + } + if ((/[aeio][aeiou][dlmnprst]$/).test(verb)) { + return verb + 'ed' + } + if ((/[aeiou][bdglmnprst]$/i).test(verb)) { + return verb.replace(/(.+[aeiou])([bdglmnprst])/, '$1$2$2ed') + } + return verb + 'ed' +} diff --git a/qortal-ui-core/src/functional-components/wordlists.js b/qortal-ui-core/src/functional-components/wordlists.js new file mode 100644 index 00000000..903889a7 --- /dev/null +++ b/qortal-ui-core/src/functional-components/wordlists.js @@ -0,0 +1,27 @@ +import { getPastTense } from './verb-past-tense.js' + +export const verbs = [ + 'abase', 'abate', 'abduct', 'abet', 'abhor', 'abide', 'abjure', 'ablate', 'abort', 'abound', 'abseil', 'absorb', 'abuse', 'abut', 'accede', 'accent', 'accept', 'access', 'accord', 'accost', 'accrue', 'accuse', 'ache', 'acquit', 'act', 'adapt', 'add', 'addict', 'addle', 'adduce', 'adhere', 'adjoin', 'adjust', 'admire', 'admit', 'adopt', 'adore', 'adorn', 'advert', 'advise', 'aerate', 'affect', 'affirm', 'affix', 'afford', 'age', 'agree', 'aid', 'aim', 'alarm', 'alert', 'alight', 'align', 'allay', 'allege', 'allot', 'allow', 'alloy', 'allure', 'ally', 'alter', 'amass', 'amaze', 'amble', 'ambush', 'amend', 'amount', 'amuse', 'anger', 'angle', 'anneal', 'annex', 'annoy', 'annul', 'anoint', 'answer', 'ape', 'appeal', 'appear', 'append', 'apply', 'arc', 'arch', 'argue', 'arise', 'arm', 'array', 'arrest', 'arrive', 'arrow', 'ascend', 'ask', 'aspire', 'assail', 'assay', 'assent', 'assert', 'assess', 'assign', 'assist', 'assort', 'assume', 'assure', 'atone', 'attach', 'attack', 'attain', 'attend', 'attest', 'attire', 'attune', 'audit', 'augur', 'author', 'avail', 'avenge', 'aver', 'avert', 'avoid', 'await', 'awake', 'awaken', 'award', 'awe', 'babble', 'back', 'badge', 'badger', 'baffle', 'bag', 'bail', 'bait', 'bake', 'bald', 'bale', 'ball', 'ballot', 'ban', 'band', 'bandy', 'bang', 'banish', 'bank', 'banter', 'bar', 'barb', 'barber', 'bard', 'bare', 'barge', 'bark', 'barn', 'barrel', 'barter', 'base', 'bash', 'bask', 'baste', 'bat', 'batch', 'bathe', 'batten', 'batter', 'battle', 'bawl', 'bay', 'be', 'beach', 'beacon', 'bead', 'beam', 'bean', 'bear', 'beard', 'beat', 'become', 'bed', 'beef', 'beep', 'beetle', 'befall', 'befit', 'beg', 'beget', 'beggar', 'begin', 'behave', 'behead', 'behold', 'belay', 'belch', 'belie', 'bell', 'bellow', 'belly', 'belong', 'belt', 'bemoan', 'bench', 'bend', 'berate', 'berry', 'beset', 'best', 'bestir', 'bestow', 'bet', 'betide', 'betray', 'better', 'bevel', 'bewail', 'beware', 'bias', 'bib', 'bicker', 'bid', 'bide', 'bilge', 'bill', 'billet', 'billow', 'bin', 'bind', 'birdie', 'birth', 'bisect', 'bit', 'bite', 'bitter', 'black', 'blame', 'blanch', 'blank', 'blare', 'blast', 'blaze', 'bleach', 'bleat', 'bleed', 'bleep', 'blench', 'blend', 'bless', 'blight', 'blind', 'blink', 'blip', 'bliss', 'blitz', 'bloat', 'blob', 'blood', 'bloody', 'bloom', 'blot', 'blotch', 'blow', 'blue', 'bluff', 'blunt', 'blur', 'blurb', 'blurt', 'blush', 'board', 'boast', 'bob', 'bode', 'body', 'bog', 'bogey', 'boggle', 'boil', 'bolt', 'bomb', 'bond', 'bone', 'bonnet', 'boo', 'book', 'boom', 'boost', 'boot', 'booze', 'bop', 'bore', 'borrow', 'boss', 'botch', 'bother', 'bottle', 'bottom', 'bounce', 'bound', 'bout', 'bow', 'bowel', 'bowl', 'box', 'brace', 'brag', 'braid', 'braise', 'brake', 'branch', 'brand', 'brave', 'brawl', 'bray', 'breach', 'bread', 'break', 'breed', 'breeze', 'brew', 'bribe', 'brick', 'bridge', 'bridle', 'brief', 'brim', 'brine', 'bring', 'broach', 'broil', 'bronze', 'brook', 'brown', 'browse', 'bruise', 'brush', 'bubble', 'buck', 'bucket', 'buckle', 'bud', 'budge', 'budget', 'buffet', 'bug', 'bugle', 'build', 'bulge', 'bulk', 'bull', 'bully', 'bumble', 'bump', 'bunch', 'bundle', 'bung', 'bungle', 'bunk', 'bunker', 'buoy', 'burble', 'burden', 'burgle', 'burn', 'burp', 'burr', 'burrow', 'burst', 'bury', 'bus', 'bush', 'busk', 'bust', 'bustle', 'busy', 'butt', 'button', 'buy', 'buzz', 'bypass', 'cab', 'cabal', 'cabin', 'cable', 'cache', 'cackle', 'cadge', 'cage', 'cajole', 'cake', 'call', 'calm', 'calve', 'camber', 'camp', 'can', 'canal', 'cancel', 'candle', 'candy', 'cane', 'cannon', 'canoe', 'canopy', 'cant', 'canter', 'cap', 'caper', 'card', 'care', 'career', 'caress', 'carol', 'carp', 'carpet', 'carry', 'cart', 'carve', 'case', 'cash', 'cast', 'castle', 'cat', 'catch', 'cater', 'caucus', 'cause', 'cave', 'cavern', 'cease', 'cede', 'cellar', 'cement', 'censor', 'chafe', 'chain', 'chair', 'chalk', 'champ', 'chance', 'change', 'chant', 'chap', 'char', 'charge', 'charm', 'chart', 'chase', 'chat', 'cheat', 'check', 'cheep', 'cheer', 'chew', 'chide', 'chill', 'chime', 'chin', 'chink', 'chip', 'chirp', 'chisel', 'chock', 'choir', 'choke', 'choose', 'chop', 'chord', 'chorus', 'chrome', 'chuck', 'chuff', 'chug', 'chum', 'chunk', 'churn', 'chute', 'cinder', 'cipher', 'circle', 'cite', 'clad', 'claim', 'clam', 'clamp', 'clang', 'clank', 'clap', 'clash', 'clasp', 'class', 'claw', 'clean', 'clear', 'cleat', 'cleave', 'clench', 'clerk', 'click', 'climax', 'climb', 'clinch', 'cling', 'clink', 'clip', 'clique', 'cloak', 'clock', 'clog', 'clone', 'close', 'closet', 'clot', 'cloud', 'clout', 'clown', 'club', 'cluck', 'clue', 'clump', 'clutch', 'coach', 'coal', 'coast', 'coat', 'coax', 'cobble', 'cobweb', 'cockle', 'cocoon', 'coddle', 'code', 'codify', 'coerce', 'coffer', 'coffin', 'cog', 'cohere', 'coil', 'coin', 'coke', 'collar', 'comb', 'combat', 'come', 'commit', 'compel', 'comply', 'con', 'concur', 'cone', 'confer', 'convey', 'convoy', 'cook', 'cool', 'cope', 'copper', 'copy', 'cord', 'cordon', 'core', 'cork', 'corn', 'corner', 'corral', 'cosset', 'cost', 'cotton', 'couch', 'cough', 'count', 'couple', 'course', 'court', 'cover', 'covet', 'cowl', 'cox', 'crab', 'crack', 'cradle', 'craft', 'cram', 'cramp', 'crane', 'crank', 'crash', 'crate', 'crater', 'crave', 'crawl', 'crayon', 'craze', 'creak', 'cream', 'crease', 'create', 'credit', 'creed', 'creep', 'crest', 'crew', 'crib', 'crick', 'crimp', 'cringe', 'crisp', 'croak', 'crook', 'croon', 'crop', 'cross', 'crouch', 'crowd', 'crown', 'cruise', 'crunch', 'crush', 'crust', 'crutch', 'cry', 'cube', 'cuckoo', 'cuddle', 'cudgel', 'cue', 'cuff', 'cull', 'cup', 'curb', 'curd', 'curdle', 'cure', 'curl', 'curry', 'curse', 'curve', 'cuss', 'cut', 'cycle', 'dab', 'dabble', 'dagger', 'dally', 'dam', 'damage', 'damn', 'damp', 'dampen', 'dance', 'dangle', 'dapple', 'dare', 'darken', 'darn', 'dart', 'dash', 'date', 'daub', 'daunt', 'dawdle', 'daze', 'dazzle', 'deaden', 'deafen', 'deal', 'debar', 'debase', 'debate', 'debit', 'debug', 'debut', 'decamp', 'decant', 'decay', 'decide', 'deck', 'decode', 'decoy', 'decree', 'decry', 'deduce', 'deduct', 'deem', 'deepen', 'deface', 'defame', 'defeat', 'defect', 'defend', 'defer', 'defile', 'define', 'deform', 'defray', 'defuse', 'defy', 'deify', 'deign', 'delay', 'delete', 'delude', 'deluge', 'delve', 'demand', 'demean', 'demise', 'demote', 'demur', 'den', 'denote', 'dent', 'denude', 'deny', 'depart', 'depend', 'depict', 'deploy', 'deport', 'depose', 'depute', 'derail', 'deride', 'derive', 'desert', 'design', 'desire', 'desist', 'detach', 'detail', 'detain', 'detect', 'deter', 'detest', 'detour', 'devil', 'devise', 'devote', 'devour', 'dial', 'diaper', 'dice', 'die', 'diet', 'differ', 'dig', 'digest', 'dilate', 'dilute', 'dim', 'dimple', 'din', 'dine', 'dint', 'dip', 'direct', 'disarm', 'disc', 'disco', 'dish', 'dismay', 'disown', 'dispel', 'disuse', 'ditch', 'dither', 'dive', 'divert', 'divest', 'divide', 'divine', 'dizzy', 'do', 'dock', 'docket', 'doctor', 'dodge', 'dog', 'dole', 'doll', 'dolly', 'dome', 'donate', 'doodle', 'doom', 'dope', 'dose', 'dot', 'dote', 'double', 'doubt', 'douse', 'dowel', 'down', 'dowse', 'doze', 'drab', 'draft', 'drag', 'drain', 'drape', 'draw', 'drawl', 'dray', 'dread', 'dream', 'dredge', 'drench', 'dress', 'drift', 'drill', 'drink', 'drip', 'drive', 'drivel', 'drone', 'drool', 'droop', 'drop', 'drown', 'drowse', 'drudge', 'drug', 'drum', 'dry', 'dub', 'duck', 'duel', 'duet', 'dull', 'dumb', 'dummy', 'dump', 'dun', 'dupe', 'dust', 'dwarf', 'dwell', 'dye', 'ear', 'earn', 'ease', 'eat', 'ebb', 'echo', 'eddy', 'edge', 'edify', 'edit', 'efface', 'egg', 'egress', 'eject', 'elapse', 'elate', 'elbow', 'elect', 'elicit', 'elide', 'elope', 'elude', 'embalm', 'embark', 'embed', 'embody', 'emboss', 'emerge', 'emit', 'employ', 'empty', 'enable', 'enact', 'enamel', 'encamp', 'encase', 'encode', 'encore', 'end', 'endear', 'endow', 'endure', 'enfold', 'engage', 'engulf', 'enjoin', 'enjoy', 'enlist', 'enrage', 'enrich', 'ensue', 'ensure', 'entail', 'enter', 'entice', 'entomb', 'entrap', 'envy', 'equal', 'equate', 'equip', 'erase', 'erect', 'erode', 'err', 'erupt', 'escape', 'eschew', 'escort', 'escrow', 'essay', 'esteem', 'etch', 'evade', 'evict', 'evince', 'evoke', 'evolve', 'exact', 'exalt', 'exceed', 'excel', 'except', 'excess', 'excise', 'excite', 'excuse', 'exempt', 'exert', 'exeunt', 'exhale', 'exhort', 'exhume', 'exile', 'exist', 'expand', 'expect', 'expel', 'expend', 'expire', 'export', 'expose', 'extend', 'extol', 'extort', 'exude', 'exult', 'eye', 'fable', 'face', 'facet', 'factor', 'fade', 'fail', 'faint', 'fair', 'fake', 'fall', 'falter', 'fame', 'fan', 'fancy', 'farce', 'fare', 'farm', 'fast', 'fasten', 'fat', 'fate', 'father', 'fathom', 'fatten', 'fault', 'fawn', 'fear', 'feast', 'fee', 'feed', 'feel', 'feign', 'fell', 'fence', 'fend', 'ferret', 'ferry', 'fester', 'fetch', 'fettle', 'feud', 'fever', 'fib', 'fiddle', 'fidget', 'field', 'fife', 'fight', 'figure', 'file', 'fill', 'fillet', 'fillip', 'film', 'filter', 'fin', 'find', 'fine', 'finger', 'finish', 'fire', 'firm', 'fish', 'fit', 'fitter', 'fix', 'fizz', 'fizzle', 'flack', 'flag', 'flail', 'flake', 'flame', 'flank', 'flap', 'flare', 'flash', 'flat', 'flaunt', 'flaw', 'flay', 'flee', 'fleece', 'fleet', 'flesh', 'flex', 'flick', 'flight', 'flinch', 'fling', 'flint', 'flip', 'flit', 'float', 'flock', 'flog', 'flood', 'floor', 'flop', 'floss', 'flour', 'flout', 'flow', 'flower', 'fluff', 'flurry', 'flush', 'flute', 'flux', 'fly', 'foal', 'foam', 'fob', 'focus', 'fodder', 'fog', 'foil', 'foist', 'fold', 'folio', 'follow', 'foment', 'fondle', 'fool', 'foot', 'forage', 'foray', 'forbid', 'force', 'ford', 'forego', 'forest', 'forge', 'forget', 'fork', 'form', 'format', 'foster', 'foul', 'found', 'fowl', 'fox', 'frame', 'frank', 'fray', 'freak', 'free', 'freeze', 'frenzy', 'fresh', 'fret', 'friend', 'fright', 'frill', 'fringe', 'frisk', 'frock', 'frog', 'frolic', 'front', 'frost', 'froth', 'frown', 'fruit', 'fry', 'fudge', 'fuel', 'full', 'fumble', 'fume', 'fun', 'fund', 'funk', 'funnel', 'fur', 'furrow', 'fuse', 'fuss', 'fuzz', 'gabble', 'gad', 'gaff', 'gag', 'gaggle', 'gain', 'gait', 'gall', 'gallop', 'gamble', 'gambol', 'game', 'gang', 'gap', 'gape', 'garage', 'garble', 'garden', 'gargle', 'garner', 'garter', 'gas', 'gash', 'gasp', 'gate', 'gather', 'gauge', 'gavel', 'gaze', 'gear', 'gel', 'gem', 'gender', 'gentle', 'get', 'ghost', 'gibber', 'gibbet', 'giddy', 'gift', 'gig', 'giggle', 'gimlet', 'gin', 'ginger', 'gird', 'girdle', 'girth', 'give', 'glad', 'glance', 'glare', 'glass', 'glaze', 'gleam', 'glean', 'glide', 'glint', 'gloat', 'globe', 'gloom', 'glory', 'gloss', 'glove', 'glow', 'glower', 'glue', 'glut', 'gnarl', 'gnash', 'gnaw', 'go', 'goad', 'gobble', 'golf', 'gong', 'goose', 'gore', 'gorge', 'gossip', 'gouge', 'govern', 'gown', 'grab', 'grace', 'grade', 'graft', 'grain', 'grant', 'graph', 'grasp', 'grass', 'grate', 'grave', 'gravel', 'graze', 'grease', 'green', 'greet', 'grey', 'grieve', 'grill', 'grin', 'grind', 'grip', 'gripe', 'grit', 'groan', 'groin', 'groom', 'groove', 'grope', 'gross', 'grouch', 'ground', 'group', 'grouse', 'grout', 'grovel', 'grow', 'growl', 'grub', 'grudge', 'grunt', 'guard', 'guess', 'guest', 'guffaw', 'guide', 'guilt', 'guise', 'gulf', 'gull', 'gully', 'gulp', 'gum', 'gun', 'gurgle', 'gush', 'gust', 'gut', 'gutter', 'guy', 'guzzle', 'gyrate', 'habit', 'hack', 'haft', 'haggle', 'hail', 'hale', 'hallo', 'halo', 'halt', 'halter', 'halve', 'ham', 'hammer', 'hamper', 'hand', 'handle', 'hang', 'hanker', 'happen', 'harass', 'harden', 'hark', 'harm', 'harp', 'harrow', 'harry', 'hash', 'hasp', 'hassle', 'haste', 'hasten', 'hat', 'hatch', 'hate', 'haul', 'haunt', 'have', 'haven', 'havoc', 'hawk', 'hay', 'hazard', 'haze', 'head', 'heal', 'heap', 'hear', 'heart', 'heat', 'heave', 'heckle', 'hector', 'hedge', 'heed', 'heel', 'heft', 'hell', 'hello', 'helm', 'help', 'hem', 'herald', 'herd', 'hew', 'hex', 'hiccup', 'hide', 'hijack', 'hike', 'hill', 'hilt', 'hinder', 'hinge', 'hint', 'hip', 'hiss', 'hit', 'hitch', 'hive', 'hoard', 'hoax', 'hob', 'hobble', 'hock', 'hoe', 'hog', 'hoist', 'hold', 'hole', 'hollow', 'home', 'hone', 'honey', 'honk', 'hood', 'hoof', 'hook', 'hoop', 'hoot', 'hop', 'hope', 'horde', 'horn', 'hose', 'host', 'hostel', 'hound', 'house', 'hovel', 'hover', 'howl', 'huddle', 'huff', 'hug', 'hulk', 'hull', 'hum', 'humble', 'humbug', 'hump', 'hunch', 'hunger', 'hunt', 'hurdle', 'hurl', 'hurrah', 'hurry', 'hurt', 'hurtle', 'hush', 'husk', 'hustle', 'hymn', 'hyphen', 'ice', 'id', 'idle', 'ignite', 'ignore', 'image', 'imbibe', 'imbue', 'imp', 'impact', 'impair', 'impale', 'impart', 'impede', 'impel', 'imply', 'import', 'impose', 'impugn', 'impute', 'inch', 'incite', 'incur', 'indent', 'index', 'indict', 'induce', 'induct', 'infect', 'infer', 'infest', 'infix', 'inform', 'infuse', 'ingest', 'inhale', 'inject', 'injure', 'ink', 'inlay', 'inlet', 'input', 'insert', 'inset', 'insist', 'insult', 'insure', 'intend', 'inter', 'intern', 'intone', 'inure', 'invade', 'invent', 'invert', 'invest', 'invite', 'invoke', 'ionize', 'iris', 'iron', 'island', 'isle', 'issue', 'itch', 'item', 'jab', 'jabber', 'jack', 'jade', 'jag', 'jail', 'jam', 'jangle', 'jape', 'jar', 'jargon', 'jaunt', 'jaw', 'jazz', 'jeer', 'jelly', 'jerk', 'jest', 'jet', 'jetty', 'jewel', 'jib', 'jibe', 'jig', 'jigsaw', 'jilt', 'jingle', 'jinx', 'jitter', 'jive', 'job', 'jockey', 'jog', 'join', 'joint', 'joke', 'jolly', 'jolt', 'jostle', 'jot', 'joust', 'joy', 'judge', 'jug', 'juggle', 'juice', 'jumble', 'jump', 'junk', 'junket', 'just', 'jut', 'kayak', 'keel', 'keen', 'keep', 'ken', 'kennel', 'kernel', 'key', 'kick', 'kid', 'kidnap', 'kill', 'kiln', 'kilt', 'kindle', 'king', 'kink', 'kipper', 'kiss', 'kit', 'kite', 'kitten', 'knead', 'knee', 'kneel', 'knell', 'knife', 'knight', 'knit', 'knock', 'knoll', 'knot', 'know', 'kosher', 'kowtow', 'laager', 'label', 'lace', 'lack', 'lackey', 'ladle', 'lag', 'lame', 'lament', 'lance', 'land', 'lap', 'lapse', 'lard', 'lark', 'lash', 'lasso', 'last', 'latch', 'lathe', 'lather', 'laud', 'laugh', 'launch', 'laurel', 'lavish', 'law', 'lay', 'layer', 'laze', 'lazy', 'leach', 'lead', 'leaf', 'league', 'leak', 'lean', 'leap', 'learn', 'lease', 'leash', 'leave', 'leaven', 'lecher', 'leech', 'leer', 'leg', 'lend', 'lesion', 'lessen', 'lesson', 'let', 'letter', 'level', 'lever', 'levy', 'libel', 'lichen', 'lick', 'lid', 'lie', 'lift', 'light', 'like', 'liken', 'lilt', 'limb', 'limber', 'lime', 'limit', 'limp', 'line', 'linger', 'link', 'lip', 'liquor', 'lisp', 'list', 'listen', 'litter', 'live', 'liven', 'load', 'loaf', 'loam', 'loan', 'loathe', 'lob', 'lobby', 'local', 'locate', 'lock', 'lodge', 'loft', 'log', 'loiter', 'loll', 'long', 'look', 'loom', 'loop', 'loose', 'loosen', 'loot', 'lop', 'lope', 'lord', 'lose', 'lot', 'loth', 'lounge', 'louse', 'lout', 'love', 'lower', 'luck', 'lug', 'lull', 'lumber', 'lump', 'lunch', 'lunge', 'lurch', 'lure', 'lurk', 'lust', 'lute', 'lynch', 'mace', 'mad', 'madden', 'mail', 'maim', 'major', 'make', 'malign', 'malt', 'man', 'manage', 'mangle', 'mantle', 'manure', 'map', 'mar', 'marble', 'march', 'margin', 'mark', 'market', 'marl', 'maroon', 'marry', 'martyr', 'marvel', 'mash', 'mask', 'mason', 'mass', 'mast', 'master', 'mat', 'match', 'mate', 'matte', 'matter', 'mature', 'maul', 'maze', 'mean', 'medal', 'meddle', 'meet', 'meld', 'mellow', 'melt', 'menace', 'mend', 'mentor', 'merge', 'merit', 'mesh', 'mess', 'metal', 'meter', 'mew', 'mildew', 'milk', 'mill', 'mimic', 'mince', 'mind', 'mine', 'mingle', 'minor', 'mint', 'minute', 'mire', 'mirror', 'miscue', 'misfit', 'mislay', 'miss', 'mist', 'misuse', 'mitre', 'mix', 'moan', 'mob', 'mock', 'model', 'modem', 'modify', 'molest', 'molten', 'monger', 'monkey', 'moon', 'moor', 'moot', 'mop', 'mope', 'morph', 'morsel', 'mortar', 'mosaic', 'moss', 'mother', 'motion', 'motive', 'motor', 'mould', 'mound', 'mount', 'mourn', 'mouse', 'mousse', 'mouth', 'move', 'mow', 'muck', 'mud', 'muddle', 'muddy', 'muff', 'muffle', 'mug', 'mulch', 'mull', 'mumble', 'mummy', 'munch', 'murder', 'murmur', 'muscle', 'muse', 'mush', 'must', 'muster', 'mutate', 'mute', 'mutiny', 'mutter', 'muzzle', 'nag', 'nail', 'name', 'nap', 'narrow', 'near', 'neaten', 'neck', 'need', 'needle', 'negate', 'neigh', 'nerve', 'nest', 'nestle', 'net', 'nettle', 'neuter', 'nibble', 'niche', 'nick', 'nickel', 'niggle', 'nigh', 'nip', 'nod', 'noise', 'noodle', 'noose', 'nose', 'notch', 'note', 'notice', 'notify', 'nudge', 'null', 'numb', 'number', 'nurse', 'nut', 'nuzzle', 'oar', 'obey', 'object', 'oblige', 'obtain', 'occult', 'occupy', 'occur', 'off', 'offend', 'offer', 'ogle', 'oh', 'oil', 'omen', 'omit', 'ooze', 'open', 'opiate', 'oppose', 'opt', 'option', 'orb', 'orbit', 'ordain', 'order', 'orient', 'orphan', 'oust', 'out', 'outbid', 'outdo', 'outfit', 'outlaw', 'outlay', 'output', 'outrun', 'outwit', 'over', 'overdo', 'owe', 'own', 'oyster', 'pace', 'pacify', 'pack', 'packet', 'pad', 'paddle', 'page', 'pain', 'paint', 'pair', 'pal', 'pale', 'pall', 'pallet', 'palm', 'palsy', 'pamper', 'pan', 'pander', 'panel', 'panic', 'pant', 'paper', 'par', 'parade', 'parcel', 'parch', 'pardon', 'pare', 'parent', 'park', 'parley', 'parody', 'parole', 'parrot', 'parry', 'parse', 'part', 'party', 'pass', 'paste', 'pastor', 'pat', 'patch', 'patent', 'patrol', 'patter', 'pause', 'pave', 'paw', 'pawn', 'pay', 'peace', 'peach', 'peak', 'peal', 'pearl', 'pebble', 'peck', 'pedal', 'peddle', 'peek', 'peel', 'peep', 'peer', 'peg', 'pellet', 'pelt', 'pen', 'pencil', 'people', 'pepper', 'perch', 'peril', 'perish', 'perk', 'perm', 'permit', 'peruse', 'pester', 'pestle', 'pet', 'phase', 'phone', 'phrase', 'pi', 'pick', 'picket', 'pickle', 'picnic', 'pie', 'piece', 'pierce', 'piffle', 'pig', 'pike', 'pile', 'pilfer', 'pill', 'pillar', 'pillow', 'pilot', 'pimp', 'pin', 'pinch', 'pine', 'ping', 'pinion', 'pink', 'pip', 'pipe', 'pique', 'pirate', 'pistol', 'pit', 'pitch', 'pith', 'pity', 'pivot', 'place', 'plague', 'plait', 'plan', 'plane', 'plank', 'plant', 'plat', 'plate', 'play', 'plead', 'please', 'pleat', 'pledge', 'plight', 'plod', 'plop', 'plot', 'plough', 'pluck', 'plug', 'plumb', 'plume', 'plump', 'plunge', 'ply', 'poach', 'pocket', 'pod', 'point', 'poise', 'poison', 'poke', 'pole', 'police', 'polish', 'polka', 'poll', 'pollen', 'pomade', 'pond', 'ponder', 'pony', 'pool', 'pop', 'pore', 'port', 'pose', 'posit', 'post', 'pot', 'potter', 'pouch', 'pounce', 'pound', 'pour', 'pout', 'powder', 'power', 'praise', 'prance', 'prank', 'prawn', 'pray', 'preach', 'preen', 'prefab', 'prefix', 'preset', 'press', 'pretty', 'prey', 'price', 'prick', 'pride', 'priest', 'prim', 'prime', 'print', 'prize', 'probe', 'prod', 'profit', 'prompt', 'prong', 'proof', 'prop', 'propel', 'prose', 'prove', 'prowl', 'prune', 'pry', 'pucker', 'puddle', 'puff', 'pug', 'puke', 'pull', 'pulp', 'pulse', 'pumice', 'pummel', 'pump', 'pun', 'punch', 'punish', 'punt', 'pup', 'purge', 'purify', 'purl', 'purple', 'purr', 'purse', 'pursue', 'push', 'put', 'putt', 'putter', 'putty', 'puzzle', 'quack', 'quaff', 'quake', 'quarry', 'quash', 'quaver', 'queen', 'queer', 'quell', 'quench', 'query', 'quest', 'queue', 'quiet', 'quill', 'quilt', 'quip', 'quit', 'quiver', 'quiz', 'quote', 'rabble', 'race', 'rack', 'racket', 'radio', 'raffle', 'raft', 'rag', 'rage', 'raid', 'rail', 'rain', 'raise', 'rake', 'rally', 'ram', 'ramble', 'ramify', 'ramp', 'ramrod', 'ranch', 'range', 'rank', 'rankle', 'ransom', 'rant', 'rap', 'rasp', 'rat', 'rate', 'ratify', 'ration', 'rattle', 'ravage', 'rave', 'ravel', 'raven', 'ravish', 'ray', 'raze', 'reach', 'react', 'read', 'ready', 'really', 'ream', 'reap', 'rear', 'reason', 'rebate', 'rebel', 'rebind', 'rebook', 'rebuff', 'rebuke', 'rebut', 'recall', 'recant', 'recap', 'recast', 'recede', 'recess', 'recite', 'reckon', 'recode', 'recoil', 'record', 'recur', 'redden', 'redeem', 'redial', 'redo', 'redraw', 'reduce', 'reed', 'reef', 'reek', 'reel', 'reeve', 'refer', 'refile', 'refill', 'refine', 'refit', 'reflex', 'reform', 'refuel', 'refuge', 'refund', 'refuse', 'refute', 'regain', 'regale', 'regard', 'regret', 'rehash', 'reheat', 'reify', 'reign', 'reject', 'rejoin', 'relate', 'relax', 'relay', 'relent', 'relink', 'relish', 'relive', 'rely', 'remain', 'remake', 'remand', 'remap', 'remark', 'remedy', 'remind', 'remit', 'remove', 'rename', 'rend', 'render', 'renege', 'renew', 'rent', 'reopen', 'repack', 'repair', 'repast', 'repay', 'repeal', 'repeat', 'repel', 'repent', 'repine', 'replay', 'reply', 'report', 'repose', 'repute', 'reread', 'rerun', 'rescue', 'resell', 'resend', 'resent', 'reset', 'reshow', 'reside', 'resign', 'resin', 'resist', 'resit', 'resort', 'rest', 'result', 'resume', 'retail', 'retain', 'retake', 'retard', 'retch', 'retell', 'retest', 'retire', 'retort', 'retry', 'retune', 'return', 'retype', 'reuse', 'revamp', 'reveal', 'revel', 'revere', 'revert', 'review', 'revile', 'revive', 'revoke', 'revolt', 'reward', 'rewind', 'reword', 'rework', 'rhyme', 'rib', 'ribbon', 'rice', 'rid', 'riddle', 'ride', 'ridge', 'riff', 'rifle', 'rift', 'rig', 'right', 'rim', 'rime', 'ring', 'rinse', 'riot', 'rip', 'ripen', 'ripple', 'rise', 'risk', 'rival', 'rivet', 'roach', 'roam', 'roar', 'roast', 'rob', 'robe', 'rock', 'rocket', 'rogue', 'roll', 'romp', 'roof', 'rook', 'room', 'roost', 'root', 'rope', 'rosin', 'rot', 'rotate', 'rouge', 'rough', 'round', 'rouse', 'rout', 'route', 'rove', 'row', 'rub', 'ruck', 'rue', 'ruff', 'ruffle', 'ruin', 'rule', 'rumble', 'rumple', 'run', 'rush', 'rust', 'rustle', 'rut', 'sack', 'sadden', 'saddle', 'safari', 'sag', 'sail', 'saint', 'sallow', 'salt', 'salute', 'sample', 'sand', 'sandal', 'sap', 'sash', 'sauce', 'sauna', 'savage', 'save', 'saw', 'say', 'scab', 'scald', 'scale', 'scalp', 'scan', 'scant', 'scape', 'scar', 'scare', 'scarf', 'scathe', 'scent', 'scheme', 'school', 'scoff', 'scold', 'scoop', 'scoot', 'scope', 'scorch', 'score', 'scorn', 'scotch', 'scour', 'scout', 'scowl', 'scrap', 'scrape', 'scrawl', 'scream', 'screen', 'screw', 'scribe', 'script', 'scroll', 'scrub', 'scrum', 'scuba', 'scud', 'scuff', 'scull', 'sculpt', 'scum', 'scurry', 'scythe', 'seal', 'seam', 'sear', 'search', 'season', 'seat', 'secede', 'second', 'sector', 'secure', 'sedate', 'seduce', 'see', 'seed', 'seek', 'seem', 'seep', 'seethe', 'seize', 'select', 'sell', 'send', 'sense', 'serge', 'serve', 'set', 'settle', 'sever', 'sew', 'shack', 'shade', 'shadow', 'shaft', 'shag', 'shake', 'sham', 'shame', 'shank', 'shape', 'share', 'shark', 'sharp', 'shave', 'shear', 'shed', 'sheer', 'shell', 'shelve', 'shield', 'shift', 'shin', 'shine', 'ship', 'shirk', 'shiver', 'shoal', 'shock', 'shoe', 'shoo', 'shoot', 'shop', 'short', 'shot', 'shout', 'shove', 'shovel', 'show', 'shower', 'shred', 'shriek', 'shrill', 'shrimp', 'shrine', 'shrink', 'shroud', 'shrug', 'shun', 'shunt', 'shut', 'shy', 'sicken', 'sickly', 'side', 'sidle', 'siege', 'sieve', 'sift', 'sigh', 'sight', 'sign', 'signal', 'signet', 'silk', 'silo', 'silt', 'silver', 'simmer', 'simper', 'simple', 'sin', 'sinew', 'sing', 'single', 'sink', 'sip', 'siphon', 'sire', 'sit', 'site', 'size', 'sizzle', 'skate', 'sketch', 'skew', 'skewer', 'ski', 'skid', 'skim', 'skimp', 'skin', 'skip', 'skirl', 'skirt', 'skulk', 'skunk', 'sky', 'slab', 'slack', 'slag', 'slake', 'slam', 'slang', 'slant', 'slap', 'slash', 'slat', 'slate', 'slave', 'slaver', 'slay', 'sleaze', 'sled', 'sledge', 'sleek', 'sleep', 'sleet', 'sleeve', 'sleigh', 'sleuth', 'slice', 'slick', 'slide', 'slight', 'slim', 'slime', 'sling', 'slink', 'slip', 'slit', 'sliver', 'slog', 'slop', 'slope', 'slosh', 'slot', 'slouch', 'slough', 'slow', 'slug', 'sluice', 'slum', 'slump', 'slur', 'slurp', 'slurry', 'slush', 'smack', 'smart', 'smash', 'smear', 'smell', 'smelt', 'smile', 'smirk', 'smite', 'smock', 'smoke', 'smooth', 'smudge', 'smut', 'snack', 'snag', 'snake', 'snap', 'snare', 'snarl', 'snatch', 'sneak', 'sneer', 'sneeze', 'snick', 'sniff', 'snip', 'snipe', 'snivel', 'snoop', 'snooze', 'snore', 'snort', 'snow', 'snub', 'snuff', 'snug', 'soak', 'soap', 'soar', 'sob', 'sober', 'sock', 'socket', 'sodden', 'soften', 'soil', 'solace', 'solder', 'sole', 'solo', 'solve', 'soot', 'soothe', 'sop', 'sorrow', 'sort', 'sortie', 'sound', 'soup', 'sour', 'source', 'south', 'sow', 'space', 'spade', 'span', 'spank', 'spar', 'spare', 'spark', 'spat', 'spawn', 'speak', 'spear', 'speck', 'speed', 'spell', 'spend', 'spew', 'sphere', 'spice', 'spike', 'spill', 'spin', 'spiral', 'spire', 'spirit', 'spit', 'spite', 'splash', 'splice', 'splint', 'split', 'spoil', 'spoke', 'sponge', 'spoof', 'spool', 'spoon', 'spoor', 'spore', 'sport', 'spot', 'spout', 'sprain', 'sprawl', 'spray', 'spread', 'sprig', 'spring', 'sprint', 'sprout', 'spruce', 'spud', 'spume', 'spur', 'spurn', 'spurt', 'spy', 'squad', 'squall', 'square', 'squash', 'squat', 'squawk', 'squeak', 'squeal', 'squib', 'squint', 'squire', 'squirm', 'squirt', 'stab', 'stable', 'stack', 'staff', 'stag', 'stage', 'stain', 'stake', 'stale', 'stalk', 'stall', 'stamp', 'stand', 'staple', 'star', 'starch', 'stare', 'start', 'starve', 'state', 'stave', 'stay', 'stead', 'steal', 'steam', 'steel', 'steep', 'steer', 'stem', 'step', 'stet', 'stew', 'stick', 'stiff', 'stifle', 'still', 'stilt', 'sting', 'stink', 'stint', 'stir', 'stitch', 'stock', 'stomp', 'stone', 'stooge', 'stool', 'stoop', 'stop', 'store', 'storm', 'story', 'stow', 'strafe', 'strain', 'strand', 'strap', 'stray', 'streak', 'stream', 'stress', 'strew', 'stride', 'strike', 'string', 'strip', 'stripe', 'strive', 'stroke', 'stroll', 'strop', 'strum', 'strut', 'stub', 'stucco', 'stud', 'study', 'stuff', 'stump', 'stun', 'stunt', 'sturdy', 'sty', 'style', 'stymie', 'subdue', 'submit', 'suck', 'sucker', 'suckle', 'suds', 'sue', 'suede', 'suffer', 'suffix', 'sugar', 'suit', 'sulk', 'sully', 'sum', 'summer', 'summit', 'summon', 'sun', 'suntan', 'sup', 'supple', 'supply', 'surf', 'surge', 'survey', 'suture', 'swab', 'swamp', 'swap', 'swarm', 'swat', 'swathe', 'sway', 'swear', 'sweat', 'sweep', 'swell', 'swerve', 'swill', 'swim', 'swing', 'swipe', 'swirl', 'swish', 'switch', 'swivel', 'swoon', 'swoop', 'swop', 'symbol', 'syrup', 'tab', 'tabby', 'table', 'taboo', 'tack', 'tackle', 'tag', 'tail', 'tailor', 'taint', 'take', 'talk', 'tallow', 'tally', 'tame', 'tamp', 'tamper', 'tan', 'tangle', 'tango', 'tank', 'tap', 'tape', 'taper', 'tar', 'target', 'tariff', 'tarry', 'tart', 'task', 'tassel', 'taste', 'tattle', 'tattoo', 'taunt', 'tax', 'taxi', 'teach', 'team', 'tear', 'tease', 'tee', 'teem', 'teeter', 'teethe', 'telex', 'tell', 'temper', 'tempt', 'tenant', 'tend', 'tender', 'tenon', 'tense', 'tent', 'tenure', 'term', 'test', 'tether', 'thank', 'thatch', 'thaw', 'thieve', 'thin', 'think', 'thirst', 'thorn', 'thou', 'thrall', 'thrash', 'thread', 'threat', 'thresh', 'thrill', 'thrive', 'throat', 'throb', 'throne', 'throng', 'throw', 'thrum', 'thrust', 'thud', 'thumb', 'thump', 'thwack', 'thwart', 'tick', 'ticket', 'tickle', 'tide', 'tidy', 'tie', 'tier', 'tile', 'till', 'tiller', 'tilt', 'timber', 'time', 'tin', 'tinge', 'tingle', 'tinker', 'tinkle', 'tinsel', 'tint', 'tip', 'tipple', 'tiptoe', 'tire', 'tissue', 'tithe', 'title', 'titter', 'toady', 'toast', 'toddle', 'toe', 'toggle', 'toil', 'token', 'toll', 'tomb', 'tomcat', 'tone', 'tongue', 'tool', 'toot', 'tooth', 'tootle', 'top', 'topple', 'torch', 'torque', 'toss', 'tot', 'total', 'totter', 'touch', 'tough', 'tour', 'tout', 'tow', 'towel', 'tower', 'toy', 'trace', 'track', 'trade', 'trail', 'train', 'tram', 'tramp', 'trance', 'trap', 'trash', 'travel', 'trawl', 'tread', 'treat', 'treble', 'tree', 'trek', 'trench', 'trend', 'triage', 'trice', 'trick', 'trill', 'trim', 'trip', 'triple', 'troll', 'troop', 'trot', 'troupe', 'trowel', 'truant', 'truck', 'trudge', 'true', 'truss', 'trust', 'try', 'tub', 'tube', 'tuck', 'tucker', 'tuft', 'tug', 'tumble', 'tun', 'tune', 'tunnel', 'turf', 'turn', 'turtle', 'tusk', 'tussle', 'tutor', 'twang', 'tweak', 'tweet', 'twig', 'twill', 'twin', 'twine', 'twinge', 'twirl', 'twist', 'twitch', 'type', 'typify', 'umpire', 'unable', 'unbend', 'unbolt', 'unclog', 'uncoil', 'undo', 'unfit', 'unfold', 'unfurl', 'unhand', 'unify', 'unite', 'unjam', 'unlace', 'unlink', 'unload', 'unlock', 'unmask', 'unpack', 'unpick', 'unplug', 'unroll', 'unseal', 'unseat', 'untie', 'unveil', 'unwind', 'unwrap', 'unzip', 'up', 'update', 'uphold', 'uplift', 'upload', 'uproot', 'upset', 'upturn', 'urge', 'use', 'usher', 'usurp', 'utter', 'vacate', 'vacuum', 'valet', 'value', 'valve', 'vamp', 'vanish', 'vary', 'vat', 'vault', 'vector', 'veer', 'veil', 'vein', 'vend', 'veneer', 'vent', 'verge', 'verify', 'verse', 'vest', 'vet', 'veto', 'vex', 'vial', 'vice', 'video', 'vie', 'view', 'vilify', 'visa', 'vision', 'visit', 'visor', 'voice', 'void', 'volley', 'vomit', 'voodoo', 'vote', 'vouch', 'vow', 'voyage', 'wad', 'waddle', 'wade', 'wafer', 'waffle', 'waft', 'wag', 'wager', 'waggle', 'wagon', 'wail', 'wait', 'waive', 'wake', 'waken', 'walk', 'wall', 'wallow', 'waltz', 'wan', 'wander', 'wane', 'want', 'wanton', 'war', 'warble', 'ward', 'warm', 'warn', 'warp', 'wash', 'waste', 'watch', 'water', 'wattle', 'wave', 'waver', 'wax', 'waylay', 'weaken', 'wean', 'weapon', 'wear', 'weary', 'weasel', 'weave', 'web', 'wed', 'wedge', 'weed', 'weep', 'weigh', 'weight', 'weld', 'well', 'welt', 'welter', 'wench', 'wend', 'wet', 'whack', 'whale', 'wharf', 'wheel', 'wheeze', 'whelp', 'whet', 'whiff', 'while', 'whine', 'whinny', 'whip', 'whir', 'whirl', 'whirr', 'whisk', 'white', 'whiten', 'whizz', 'whoop', 'whoosh', 'wick', 'widen', 'widow', 'wield', 'wig', 'wiggle', 'wild', 'wile', 'will', 'wilt', 'wimple', 'win', 'wince', 'winch', 'wind', 'window', 'wine', 'wing', 'wink', 'winnow', 'winter', 'wipe', 'wire', 'wish', 'wisp', 'wit', 'witch', 'wither', 'wobble', 'wolf', 'wonder', 'wont', 'woo', 'wood', 'word', 'work', 'worm', 'worry', 'worsen', 'worst', 'wound', 'wow', 'wrack', 'wrap', 'wreak', 'wreath', 'wreck', 'wrench', 'wrest', 'wring', 'write', 'writhe', 'wrong', 'x-ray', 'xerox', 'yacht', 'yak', 'yap', 'yard', 'yaw', 'yawn', 'yearn', 'yeast', 'yell', 'yellow', 'yelp', 'yen', 'yes', 'yield', 'yo-yo', 'yodel', 'yoke', 'zero', 'zigzag', 'zinc', 'zip', 'zipper', 'zone', 'zoom' +] +export const nouns = [ + 'abacus', 'abbey', 'abroad', 'abuse', 'access', 'acid', 'act', 'action', 'actor', 'ad', 'adult', 'advice', 'affair', 'affect', 'age', 'agency', 'agenda', 'agent', 'aglet', 'aid', 'air', 'airbag', 'airbus', 'alarm', 'alb', 'alcove', 'alder', 'alibi', 'alley', 'alloy', 'almond', 'alpaca', 'alpha', 'alto', 'amount', 'analog', 'anger', 'angle', 'angora', 'animal', 'anime', 'ankle', 'anklet', 'annual', 'anorak', 'answer', 'ant', 'antler', 'ape', 'appeal', 'apple', 'apron', 'apse', 'arch', 'archer', 'area', 'arm', 'armor', 'army', 'arrow', 'art', 'ascot', 'ash', 'ashram', 'aside', 'ask', 'aspect', 'assist', 'atom', 'atrium', 'attack', 'attic', 'aunt', 'author', 'avenue', 'award', 'babe', 'baboon', 'baby', 'back', 'bacon', 'bad', 'badge', 'badger', 'bag', 'bagel', 'bail', 'bait', 'bake', 'baker', 'bakery', 'ball', 'ballet', 'bamboo', 'banana', 'band', 'bangle', 'banjo', 'bank', 'banker', 'baobab', 'bar', 'barber', 'barge', 'barium', 'barn', 'base', 'basin', 'basis', 'basket', 'bass', 'bat', 'bath', 'bather', 'batter', 'battle', 'bay', 'bayou', 'beach', 'bead', 'beak', 'beam', 'bean', 'beanie', 'bear', 'beard', 'beast', 'beat', 'beauty', 'beaver', 'bed', 'bee', 'beech', 'beef', 'beer', 'beet', 'beetle', 'beggar', 'behest', 'being', 'belfry', 'belief', 'bell', 'belly', 'belt', 'bench', 'bend', 'bengal', 'beret', 'berry', 'bet', 'beyond', 'bid', 'bidet', 'big', 'bijou', 'bike', 'bikini', 'bill', 'bin', 'birch', 'bird', 'birth', 'bit', 'bite', 'bitter', 'black', 'blade', 'blame', 'blank', 'blazer', 'blight', 'blind', 'block', 'blood', 'bloom', 'blouse', 'blow', 'blue', 'boar', 'board', 'boat', 'bobcat', 'body', 'bog', 'bolero', 'bolt', 'bomb', 'bomber', 'bone', 'bongo', 'bonnet', 'bonsai', 'bonus', 'book', 'boot', 'bootee', 'bootie', 'boots', 'booty', 'border', 'bore', 'bosom', 'boss', 'botany', 'bother', 'bottle', 'bottom', 'bough', 'bow', 'bower', 'bowl', 'bowler', 'bowtie', 'box', 'boxer', 'boy', 'bra', 'brace', 'brain', 'brake', 'branch', 'brand', 'brandy', 'brass', 'brave', 'bread', 'break', 'breast', 'breath', 'breeze', 'brick', 'bridge', 'brief', 'briefs', 'broad', 'broker', 'brome', 'bronco', 'bronze', 'brooch', 'brood', 'brook', 'broom', 'brow', 'brown', 'brush', 'bubble', 'bucket', 'buckle', 'bud', 'buddy', 'budget', 'buffer', 'buffet', 'bug', 'buggy', 'bugle', 'bulb', 'bull', 'bullet', 'bumper', 'bun', 'bunch', 'burn', 'burst', 'bus', 'bush', 'bust', 'bustle', 'butane', 'butter', 'button', 'buy', 'buyer', 'cabana', 'cabin', 'cable', 'cacao', 'cactus', 'caddy', 'cadet', 'cafe', 'caftan', 'cake', 'calf', 'calico', 'call', 'calm', 'camel', 'cameo', 'camera', 'camp', 'can', 'canal', 'cancel', 'cancer', 'candle', 'candy', 'cane', 'cannon', 'canoe', 'canon', 'canopy', 'canvas', 'cap', 'cape', 'capon', 'car', 'carbon', 'card', 'care', 'career', 'cargo', 'carol', 'carp', 'carpet', 'carrot', 'carry', 'cart', 'case', 'cash', 'casino', 'cast', 'castle', 'cat', 'catch', 'catsup', 'cattle', 'cause', 'cave', 'cd', 'celery', 'cell', 'cellar', 'cello', 'cement', 'census', 'cent', 'center', 'cereal', 'chafe', 'chain', 'chair', 'chaise', 'chalet', 'chalk', 'chance', 'change', 'chaos', 'chap', 'chapel', 'chard', 'charge', 'charm', 'chart', 'check', 'cheek', 'chef', 'cheque', 'cherry', 'chess', 'chest', 'chick', 'chief', 'child', 'chill', 'chime', 'chin', 'chino', 'chip', 'chive', 'choice', 'choker', 'chop', 'chord', 'chrome', 'chub', 'chug', 'church', 'churn', 'cicada', 'cinema', 'circle', 'cirrus', 'city', 'claim', 'clam', 'clank', 'clasp', 'class', 'clause', 'clave', 'cleat', 'clef', 'cleric', 'clerk', 'click', 'client', 'cliff', 'climb', 'clip', 'cloak', 'clock', 'clogs', 'close', 'closet', 'cloth', 'cloud', 'cloudy', 'clove', 'clover', 'club', 'clue', 'clutch', 'coach', 'coal', 'coast', 'coat', 'cob', 'cobweb', 'cocoa', 'cod', 'code', 'codon', 'coffee', 'coffin', 'coil', 'coin', 'coke', 'cold', 'collar', 'colon', 'colony', 'color', 'colt', 'column', 'comb', 'combat', 'comic', 'comma', 'common', 'condor', 'cone', 'conga', 'congo', 'consul', 'cook', 'cookie', 'cope', 'copper', 'copy', 'cord', 'cork', 'corn', 'corner', 'cornet', 'corral', 'cost', 'cot', 'cotton', 'couch', 'cougar', 'cough', 'count', 'county', 'couple', 'course', 'court', 'cousin', 'cover', 'cow', 'cowboy', 'crab', 'crack', 'cradle', 'craft', 'crash', 'crate', 'cravat', 'craw', 'crayon', 'crazy', 'cream', 'creche', 'credit', 'creek', 'crest', 'crew', 'crib', 'crime', 'crocus', 'crook', 'crop', 'cross', 'crotch', 'croup', 'crow', 'crowd', 'crown', 'crude', 'crush', 'cry', 'cub', 'cuckoo', 'cup', 'cupola', 'curio', 'curl', 'curler', 'cursor', 'curve', 'cut', 'cutlet', 'cycle', 'cymbal', 'cynic', 'cyst', 'dad', 'dagger', 'dahlia', 'daisy', 'damage', 'dame', 'dance', 'dancer', 'danger', 'daniel', 'dare', 'dark', 'dart', 'dash', 'data', 'date', 'david', 'day', 'daybed', 'dead', 'deal', 'dealer', 'dear', 'death', 'debate', 'debt', 'debtor', 'decade', 'deck', 'deep', 'deer', 'degree', 'delay', 'delete', 'demand', 'demur', 'den', 'denim', 'depth', 'deputy', 'derby', 'desert', 'design', 'desire', 'desk', 'detail', 'device', 'devil', 'dew', 'dhow', 'diadem', 'dibble', 'dickey', 'diet', 'dig', 'digger', 'dill', 'dime', 'dimple', 'diner', 'dinghy', 'dinner', 'dirndl', 'dirt', 'disco', 'dish', 'dishes', 'disk', 'divan', 'diver', 'divide', 'diving', 'dock', 'doctor', 'doe', 'dog', 'doll', 'dollar', 'dolman', 'domain', 'donkey', 'door', 'dory', 'dot', 'double', 'doubt', 'draft', 'drag', 'dragon', 'drain', 'drake', 'drama', 'draw', 'drawer', 'dream', 'dress', 'drill', 'drink', 'drive', 'driver', 'drop', 'drug', 'drum', 'drunk', 'dry', 'dryer', 'duck', 'dud', 'due', 'duffel', 'dugout', 'dump', 'dust', 'duster', 'duty', 'dwarf', 'dynamo', 'eagle', 'ear', 'earth', 'ease', 'easel', 'east', 'eat', 'eave', 'e-book', 'eddy', 'edge', 'edger', 'editor', 'edward', 'eel', 'effect', 'effort', 'egg', 'eggnog', 'eight', 'elbow', 'elixir', 'elk', 'elm', 'emery', 'employ', 'emu', 'end', 'enemy', 'energy', 'engine', 'enigma', 'entry', 'envy', 'epee', 'epoch', 'eponym', 'epoxy', 'equal', 'era', 'error', 'escape', 'ese', 'essay', 'estate', 'ethics', 'europe', 'event', 'exam', 'excuse', 'exile', 'exit', 'expert', 'extent', 'eye', 'eyelid', 'face', 'facet', 'fact', 'factor', 'fail', 'fairy', 'faith', 'fall', 'fame', 'family', 'fan', 'fang', 'fanny', 'farm', 'farmer', 'fascia', 'fat', 'father', 'faucet', 'fault', 'fawn', 'fax', 'fear', 'feast', 'fedora', 'fee', 'feed', 'feel', 'feet', 'felony', 'female', 'fen', 'fence', 'fender', 'ferry', 'few', 'fiber', 'fibre', 'fiddle', 'field', 'fifth', 'fight', 'figure', 'file', 'fill', 'filly', 'film', 'filth', 'final', 'find', 'fine', 'finger', 'finish', 'fir', 'fire', 'fish', 'fix', 'flag', 'flame', 'flare', 'flash', 'flat', 'flavor', 'flax', 'fleck', 'fleece', 'flesh', 'flight', 'flock', 'flood', 'floor', 'flour', 'flow', 'flower', 'flu', 'fluke', 'flute', 'fly', 'foam', 'fob', 'focus', 'fog', 'fold', 'folder', 'fondue', 'font', 'food', 'foot', 'foray', 'force', 'forest', 'fork', 'form', 'formal', 'format', 'former', 'fort', 'forum', 'fowl', 'fox', 'frame', 'freeze', 'freon', 'fresco', 'fridge', 'friend', 'fringe', 'frock', 'frog', 'front', 'frost', 'frown', 'fruit', 'fuel', 'full', 'fun', 'funny', 'fur', 'futon', 'future', 'gaffer', 'gain', 'gale', 'galley', 'gallon', 'galn', 'game', 'gander', 'gap', 'garage', 'garb', 'garden', 'garlic', 'garter', 'gas', 'gate', 'gather', 'gauge', 'gazebo', 'gear', 'geese', 'gem', 'gender', 'gene', 'george', 'gerbil', 'geyser', 'ghost', 'giant', 'gift', 'girdle', 'girl', 'git', 'give', 'glad', 'gland', 'glass', 'glen', 'glider', 'glove', 'gloves', 'glue', 'glut', 'go', 'goal', 'goat', 'god', 'gold', 'golf', 'gong', 'good', 'goodie', 'goose', 'gopher', 'gossip', 'gown', 'grab', 'grade', 'grain', 'gram', 'grand', 'granny', 'grape', 'graph', 'grass', 'gray', 'grease', 'great', 'greek', 'green', 'grey', 'grief', 'grill', 'grip', 'grit', 'ground', 'group', 'grouse', 'growth', 'guard', 'guess', 'guest', 'guide', 'guilt', 'guilty', 'guitar', 'gum', 'gun', 'gutter', 'guy', 'gym', 'gyro', 'habit', 'hail', 'hair', 'half', 'hall', 'hamaki', 'hammer', 'hand', 'handle', 'hang', 'harbor', 'harm', 'harp', 'hat', 'hatbox', 'hate', 'hatred', 'haunt', 'hawk', 'hay', 'head', 'health', 'heart', 'hearth', 'heat', 'heater', 'heaven', 'heavy', 'hedge', 'heel', 'height', 'helen', 'helium', 'hell', 'hello', 'helmet', 'helo', 'help', 'hemp', 'hen', 'herb', 'heron', 'heyday', 'hide', 'high', 'hill', 'hip', 'hire', 'hit', 'hive', 'hobbit', 'hobby', 'hockey', 'hoe', 'hog', 'hold', 'hole', 'home', 'honey', 'hood', 'hoof', 'hook', 'hope', 'hops', 'horn', 'hornet', 'horror', 'horse', 'hose', 'host', 'hostel', 'hot', 'hotel', 'hour', 'house', 'hovel', 'hub', 'hubcap', 'hugger', 'human', 'humor', 'humour', 'hunger', 'hunt', 'hurry', 'hurt', 'hut', 'hutch', 'hyena', 'ice', 'icicle', 'icon', 'idea', 'ideal', 'if', 'igloo', 'image', 'impact', 'inbox', 'inch', 'income', 'index', 'injury', 'ink', 'inlay', 'inn', 'input', 'insect', 'inside', 'invite', 'iris', 'iron', 'irony', 'island', 'issue', 'it', 'item', 'jackal', 'jacket', 'jaguar', 'jail', 'jam', 'james', 'jar', 'jaw', 'jeans', 'jeep', 'jeff', 'jelly', 'jet', 'jewel', 'jiffy', 'job', 'jockey', 'joey', 'join', 'joint', 'joke', 'jot', 'joy', 'judge', 'judo', 'juice', 'jumbo', 'jump', 'jumper', 'junior', 'junk', 'junker', 'junket', 'jury', 'jute', 'kale', 'karate', 'karen', 'kayak', 'kazoo', 'keep', 'kendo', 'ketch', 'kettle', 'key', 'kick', 'kid', 'kidney', 'kill', 'kilt', 'kimono', 'kind', 'king', 'kiosk', 'kiss', 'kite', 'kitten', 'kitty', 'klomps', 'knee', 'knife', 'knight', 'knot', 'koala', 'lab', 'labour', 'lace', 'lack', 'ladder', 'lady', 'lake', 'lamb', 'lamp', 'lan', 'lanai', 'land', 'lap', 'lapdog', 'laptop', 'larch', 'larder', 'lark', 'latex', 'lathe', 'latte', 'laugh', 'lava', 'law', 'lawn', 'lawyer', 'lay', 'layer', 'lead', 'leader', 'leaf', 'league', 'leaker', 'leash', 'leave', 'leaver', 'leek', 'leg', 'legal', 'legume', 'lei', 'lemon', 'lemur', 'length', 'lentil', 'lesson', 'let', 'letter', 'level', 'lever', 'lie', 'lier', 'life', 'lift', 'light', 'lilac', 'lily', 'limit', 'limo', 'line', 'linen', 'liner', 'link', 'lion', 'lip', 'liquid', 'liquor', 'lisa', 'list', 'listen', 'litter', 'liver', 'living', 'lizard', 'llama', 'load', 'loaf', 'loafer', 'loan', 'local', 'lock', 'locker', 'locket', 'locust', 'loft', 'log', 'loggia', 'logic', 'long', 'look', 'loss', 'lot', 'lotion', 'lounge', 'lout', 'love', 'low', 'luck', 'lumber', 'lunch', 'lung', 'lunge', 'lute', 'lycra', 'lye', 'lynx', 'lyre', 'lyric', 'magic', 'maid', 'maiden', 'mail', 'main', 'major', 'make', 'makeup', 'male', 'mall', 'mallet', 'mambo', 'man', 'maniac', 'manner', 'manor', 'mantel', 'mantle', 'mantua', 'manx', 'many', 'map', 'maple', 'maraca', 'marble', 'mare', 'margin', 'mark', 'market', 'marsh', 'mask', 'mass', 'master', 'mat', 'match', 'mate', 'math', 'matter', 'maybe', 'mayor', 'meal', 'meat', 'media', 'medium', 'meet', 'melody', 'member', 'memory', 'men', 'menu', 'mess', 'metal', 'meteor', 'meter', 'method', 'metro', 'mice', 'middle', 'midi', 'might', 'mile', 'milk', 'mime', 'mimosa', 'mind', 'mine', 'mini', 'minion', 'minor', 'mint', 'minute', 'mirror', 'misfit', 'miss', 'mist', 'mister', 'miter', 'mitten', 'mix', 'mixer', 'moat', 'mobile', 'mocha', 'mode', 'model', 'modem', 'mole', 'mom', 'moment', 'money', 'monger', 'monkey', 'month', 'mood', 'moon', 'mop', 'morsel', 'mosque', 'most', 'motel', 'moth', 'mother', 'motion', 'motor', 'mound', 'mouse', 'mouser', 'mousse', 'mouth', 'mouton', 'move', 'mover', 'movie', 'mower', 'mud', 'mug', 'mukluk', 'mule', 'muscle', 'museum', 'music', 'mutt', 'n', 'nail', 'name', 'naming', 'napkin', 'nasty', 'nation', 'native', 'nature', 'neat', 'neck', 'need', 'needle', 'neon', 'nephew', 'nerve', 'nest', 'net', 'news', 'nexus', 'nicety', 'niche', 'nickel', 'niece', 'night', 'nobody', 'node', 'noise', 'noodle', 'normal', 'norse', 'north', 'nose', 'note', 'notice', 'notify', 'nougat', 'novel', 'nudge', 'number', 'nurse', 'nut', 'nylon', 'oak', 'oar', 'oasis', 'obi', 'object', 'oboe', 'ocean', 'ocelot', 'octave', 'octavo', 'octet', 'oeuvre', 'offer', 'office', 'oil', 'okra', 'oldie', 'olive', 'omega', 'omelet', 'one', 'onion', 'open', 'opera', 'opium', 'option', 'orange', 'orator', 'orchid', 'order', 'organ', 'osprey', 'other', 'others', 'ott', 'otter', 'ounce', 'outfit', 'outlay', 'output', 'outset', 'oval', 'ovary', 'oven', 'owl', 'owner', 'ox', 'oxen', 'oxford', 'oxygen', 'oyster', 'pace', 'pack', 'packet', 'pad', 'paddle', 'page', 'pagoda', 'pail', 'pain', 'paint', 'pair', 'pajama', 'palm', 'pan', 'panda', 'panic', 'pansy', 'pantry', 'pants', 'panty', 'paper', 'parade', 'parcel', 'pard', 'parent', 'park', 'parka', 'parrot', 'part', 'party', 'pass', 'past', 'pasta', 'paste', 'pastor', 'pastry', 'patch', 'path', 'patina', 'patio', 'patrol', 'pause', 'paw', 'pay', 'payee', 'pea', 'peace', 'peach', 'peak', 'peanut', 'pear', 'pearl', 'pedal', 'peen', 'peer', 'pelt', 'pen', 'pencil', 'peony', 'people', 'pepper', 'perch', 'period', 'permit', 'perp', 'person', 'pest', 'pet', 'petal', 'pew', 'pha', 'phase', 'phone', 'photo', 'phrase', 'piano', 'pick', 'pickax', 'picket', 'pickle', 'pie', 'piece', 'pier', 'piety', 'pig', 'pigeon', 'pike', 'pile', 'pillow', 'pilot', 'pimp', 'pimple', 'pin', 'pine', 'ping', 'pink', 'pinkie', 'pint', 'pinto', 'pipe', 'piracy', 'piss', 'pitch', 'pith', 'pizza', 'place', 'plain', 'plan', 'plane', 'planet', 'plant', 'plate', 'play', 'player', 'plenty', 'plier', 'plot', 'plough', 'plover', 'plow', 'plume', 'pocket', 'poem', 'poet', 'poetry', 'point', 'poison', 'pole', 'police', 'policy', 'polish', 'polo', 'pompom', 'poncho', 'pond', 'pony', 'poof', 'pool', 'pop', 'poppy', 'porch', 'port', 'porter', 'post', 'poster', 'pot', 'potato', 'potty', 'pouch', 'pound', 'powder', 'power', 'press', 'price', 'pride', 'priest', 'prince', 'print', 'prior', 'prison', 'prize', 'profit', 'prompt', 'proof', 'prose', 'prow', 'pruner', 'public', 'puddle', 'puffin', 'pull', 'pulley', 'puma', 'pump', 'punch', 'pupa', 'pupil', 'puppy', 'purple', 'purse', 'push', 'pusher', 'put', 'pvc', 'pyjama', 'quail', 'quart', 'quartz', 'queen', 'quiet', 'quill', 'quilt', 'quince', 'quit', 'quiver', 'quote', 'rabbi', 'rabbit', 'race', 'racer', 'racing', 'racism', 'racist', 'rack', 'radar', 'radio', 'radish', 'raffle', 'raft', 'rag', 'rage', 'rail', 'rain', 'raise', 'rake', 'ram', 'ramie', 'ranch', 'random', 'range', 'rank', 'rat', 'rate', 'ratio', 'raven', 'raw', 'ray', 'rayon', 'reach', 'read', 'reamer', 'rear', 'reason', 'recess', 'recipe', 'record', 'red', 'reef', 'refund', 'refuse', 'region', 'regret', 'reject', 'relief', 'relish', 'remote', 'remove', 'rent', 'repair', 'repeat', 'reply', 'report', 'resale', 'resist', 'resort', 'rest', 'result', 'retina', 'return', 'reveal', 'review', 'reward', 'rhyme', 'rhythm', 'rice', 'rich', 'riddle', 'ride', 'rider', 'ridge', 'rifle', 'right', 'rim', 'ring', 'rip', 'ripple', 'rise', 'riser', 'risk', 'river', 'road', 'roast', 'robe', 'robin', 'rock', 'rocker', 'rocket', 'rod', 'role', 'roll', 'roller', 'roof', 'room', 'root', 'rope', 'rose', 'rotate', 'rough', 'round', 'route', 'router', 'row', 'royal', 'rub', 'rubber', 'rubric', 'ruckus', 'ruffle', 'rugby', 'ruin', 'rule', 'rum', 'run', 'runner', 'rush', 'ruth', 'ry', 'sabre', 'sack', 'sad', 'saddle', 'safe', 'safety', 'sage', 'sail', 'sailor', 'salad', 'salary', 'sale', 'salmon', 'salon', 'saloon', 'salt', 'sampan', 'sample', 'sand', 'sari', 'sarong', 'sash', 'satin', 'satire', 'sauce', 'save', 'saving', 'savior', 'saw', 'scale', 'scarf', 'scene', 'scent', 'scheme', 'school', 'score', 'scorn', 'scow', 'screen', 'screw', 'scrim', 'scrip', 'script', 'sea', 'seal', 'search', 'season', 'seat', 'second', 'secret', 'sector', 'secure', 'seed', 'seeder', 'select', 'self', 'sell', 'senior', 'sense', 'sepal', 'series', 'serve', 'server', 'set', 'sewer', 'sex', 'shack', 'shade', 'shadow', 'shake', 'shaker', 'shame', 'shanty', 'shape', 'share', 'shark', 'sharon', 'shawl', 'she', 'shears', 'sheath', 'shed', 'sheep', 'sheet', 'shelf', 'shell', 'sherry', 'shield', 'shift', 'shin', 'shine', 'ship', 'shirt', 'shoat', 'shock', 'shoe', 'shoes', 'shofar', 'shoot', 'shop', 'shore', 'shorts', 'shot', 'shovel', 'show', 'shower', 'shred', 'shrimp', 'shrine', 'sick', 'side', 'siding', 'sign', 'signal', 'signet', 'signup', 'silica', 'silk', 'sill', 'silly', 'silo', 'silver', 'simple', 'sing', 'singer', 'single', 'sink', 'sir', 'sister', 'sitar', 'site', 'size', 'skate', 'skiing', 'skill', 'skin', 'skirt', 'skull', 'skunk', 'sky', 'slash', 'slave', 'sled', 'sledge', 'sleep', 'sleet', 'sleuth', 'slice', 'slide', 'slider', 'slime', 'slip', 'slope', 'sloth', 'smash', 'smell', 'smile', 'smock', 'smog', 'smoke', 'snail', 'snake', 'sneeze', 'snob', 'snorer', 'snow', 'soap', 'soccer', 'sock', 'socks', 'soda', 'sofa', 'soft', 'soil', 'solid', 'son', 'song', 'sonnet', 'soot', 'sorbet', 'sorrow', 'sort', 'sound', 'soup', 'source', 'south', 'sow', 'soy', 'space', 'spade', 'spank', 'spare', 'spark', 'spasm', 'spear', 'speech', 'speed', 'spell', 'spend', 'sphere', 'sphynx', 'spider', 'spike', 'spine', 'spiral', 'spirit', 'spite', 'spleen', 'split', 'sponge', 'spoon', 'sport', 'spot', 'spray', 'spread', 'spring', 'sprout', 'spruce', 'spume', 'spur', 'spy', 'square', 'squash', 'squid', 'stable', 'stack', 'staff', 'stag', 'stage', 'stain', 'stair', 'stamen', 'stamp', 'stance', 'stand', 'star', 'start', 'state', 'status', 'stay', 'steak', 'steal', 'steam', 'steel', 'stem', 'step', 'steps', 'stew', 'stick', 'still', 'stitch', 'stock', 'stole', 'stone', 'stool', 'stop', 'store', 'storey', 'storm', 'story', 'stove', 'strain', 'strait', 'strap', 'straw', 'stream', 'street', 'stress', 'strike', 'string', 'strip', 'stroke', 'stud', 'studio', 'study', 'stuff', 'stupid', 'style', 'stylus', 'suburb', 'subway', 'suck', 'suede', 'sugar', 'suit', 'sultan', 'summer', 'sun', 'sunday', 'supply', 'survey', 'sushi', 'SUV', 'swamp', 'swan', 'swath', 'sweat', 'sweats', 'sweet', 'sweets', 'swell', 'swim', 'swing', 'swiss', 'switch', 'swivel', 'sword', 'synod', 'syrup', 'system', 'tabby', 'table', 'tackle', 'tail', 'tailor', 'tale', 'talk', 'tam', 'tandem', 'tank', 'tanker', 'tap', 'tard', 'target', 'task', 'tassel', 'taste', 'tatami', 'tattoo', 'tavern', 'tax', 'taxi', 'tea', 'teach', 'team', 'tear', 'teen', 'teeth', 'tell', 'teller', 'temp', 'temper', 'temple', 'tempo', 'tennis', 'tenor', 'tent', 'tepee', 'term', 'test', 'text', 'thanks', 'thaw', 'theism', 'theme', 'theory', 'thigh', 'thing', 'thirst', 'thomas', 'thong', 'thongs', 'thorn', 'thread', 'thrill', 'throat', 'throne', 'thrush', 'thumb', 'tiara', 'tic', 'ticket', 'tie', 'tiger', 'tight', 'tights', 'tile', 'till', 'timber', 'time', 'timer', 'tin', 'tinkle', 'tip', 'tire', 'tissue', 'title', 'toad', 'toast', 'today', 'toe', 'toga', 'togs', 'toilet', 'tom', 'tomato', 'ton', 'tone', 'tongue', 'tool', 'toot', 'tooth', 'top', 'topic', 'toque', 'torso', 'tosser', 'total', 'tote', 'touch', 'tough', 'tour', 'towel', 'tower', 'town', 'toy', 'track', 'trade', 'trail', 'train', 'tram', 'tramp', 'trash', 'travel', 'tray', 'treat', 'tree', 'tremor', 'trench', 'trial', 'tribe', 'trick', 'trim', 'trip', 'tripod', 'trout', 'trove', 'trowel', 'truck', 'trunk', 'trust', 'truth', 'try', 'tub', 'tuba', 'tube', 'tulip', 'tummy', 'tuna', 'tune', 'tunic', 'tunnel', 'turban', 'turn', 'turnip', 'turret', 'turtle', 'tussle', 'tutu', 'tuxedo', 'tv', 'twig', 'twine', 'twist', 'two', 'type', 'tyvek', 'uncle', 'union', 'unique', 'unit', 'unity', 'upper', 'urn', 'usage', 'use', 'user', 'usher', 'usual', 'vacuum', 'valley', 'value', 'van', 'vane', 'vanity', 'vase', 'vast', 'vault', 'veal', 'veil', 'vein', 'veldt', 'vellum', 'velvet', 'venom', 'verse', 'verve', 'vessel', 'vest', 'vibe', 'video', 'view', 'villa', 'vinyl', 'viola', 'violet', 'violin', 'virtue', 'virus', 'vise', 'vision', 'visit', 'visor', 'visual', 'vixen', 'voice', 'volume', 'voyage', 'wad', 'wafer', 'waffle', 'waist', 'wait', 'waiter', 'wake', 'walk', 'walker', 'wall', 'wallet', 'walnut', 'walrus', 'wampum', 'war', 'warden', 'warmth', 'wash', 'washer', 'wasp', 'waste', 'watch', 'water', 'wave', 'wax', 'way', 'wealth', 'weapon', 'wear', 'weasel', 'web', 'wedge', 'weed', 'weeder', 'week', 'weight', 'weird', 'well', 'west', 'whale', 'wharf', 'wheat', 'wheel', 'while', 'whip', 'white', 'whole', 'whorl', 'width', 'wife', 'will', 'willow', 'win', 'wind', 'window', 'wine', 'wing', 'winner', 'winter', 'wire', 'wisdom', 'wish', 'witch', 'wolf', 'wombat', 'women', 'wonder', 'wood', 'wool', 'woolen', 'word', 'work', 'worker', 'world', 'worm', 'worry', 'worth', 'worthy', 'wound', 'wrap', 'wren', 'wrench', 'wrist', 'writer', 'wrong', 'yacht', 'yak', 'yam', 'yard', 'yarn', 'yawl', 'year', 'yeast', 'yellow', 'yew', 'yin', 'yoga', 'yogurt', 'yoke', 'you', 'young', 'youth', 'yurt', 'zebra', 'zephyr', 'zinc', 'zipper', 'zither', 'zone', 'zoo' +] +export const adverbs = [ + 'ably', 'acidly', 'airily', 'ally', 'amply', 'apply', 'aptly', 'archly', 'avidly', 'badly', 'baldly', 'barely', 'basely', 'belly', 'bodily', 'boldly', 'bubbly', 'bully', 'burly', 'busily', 'calmly', 'chilly', 'coldly', 'comely', 'comply', 'coolly', 'cosily', 'costly', 'coyly', 'cuddly', 'curly', 'curtly', 'daily', 'dally', 'damply', 'darkly', 'deadly', 'dearly', 'deeply', 'deftly', 'dimly', 'direly', 'doily', 'dolly', 'doubly', 'dourly', 'drily', 'dryly', 'dually', 'dully', 'duly', 'dumbly', 'early', 'easily', 'edgily', 'eerily', 'evenly', 'evilly', 'fairly', 'family', 'feebly', 'fiddly', 'filly', 'finely', 'firmly', 'fitly', 'flatly', 'fly', 'folly', 'fondly', 'foully', 'freely', 'frilly', 'fully', 'gadfly', 'gaily', 'gamely', 'gangly', 'gently', 'giggly', 'gladly', 'glibly', 'glumly', 'godly', 'golly', 'goodly', 'googly', 'grimly', 'grisly', 'gully', 'hardly', 'hazily', 'highly', 'hilly', 'holly', 'holy', 'homely', 'homily', 'hotly', 'hourly', 'hugely', 'humbly', 'icily', 'idly', 'imply', 'jangly', 'jelly', 'jokily', 'jolly', 'justly', 'keenly', 'kindly', 'kingly', 'lamely', 'lastly', 'lately', 'lazily', 'likely', 'lily', 'limply', 'lively', 'lolly', 'lonely', 'lordly', 'loudly', 'lovely', 'lowly', 'madly', 'mainly', 'manly', 'mayfly', 'mealy', 'meanly', 'measly', 'meekly', 'merely', 'mildly', 'mostly', 'mutely', 'namely', 'nearly', 'neatly', 'newly', 'nicely', 'nimbly', 'nobly', 'nosily', 'numbly', 'oddly', 'oily', 'only', 'openly', 'orally', 'overly', 'palely', 'partly', 'pearly', 'pebbly', 'pertly', 'pimply', 'ply', 'poorly', 'portly', 'primly', 'purely', 'rally', 'rarely', 'rashly', 'really', 'rely', 'reply', 'richly', 'ripely', 'rosily', 'rudely', 'sadly', 'safely', 'sagely', 'sally', 'sanely', 'scaly', 'seemly', 'shyly', 'sickly', 'silly', 'simply', 'singly', 'slily', 'slowly', 'sly', 'slyly', 'smelly', 'smugly', 'snugly', 'softly', 'solely', 'sorely', 'sourly', 'stably', 'steely', 'subtly', 'sully', 'supply', 'surely', 'surly', 'tally', 'tamely', 'tartly', 'tautly', 'termly', 'thinly', 'tidily', 'timely', 'tingly', 'tinkly', 'triply', 'truly', 'ugly', 'unduly', 'unholy', 'unruly', 'vainly', 'vastly', 'viably', 'vilely', 'waggly', 'wanly', 'warily', 'warmly', 'wavily', 'weakly', 'weekly', 'wetly', 'wholly', 'widely', 'wifely', 'wildly', 'wily', 'wisely', 'wobbly', 'woolly', 'wryly', 'yearly' +] +export const interjections = [ + 'aha', 'ahem', 'ahh', 'ahoy', 'alas', 'arg', 'aw', 'bam', 'bingo', 'blah', 'boo', 'bravo', 'brrr', 'cheers', 'dang', 'drat', 'darn', 'duh', 'eek', 'eh', 'encore', 'eureka', 'gee', 'golly', 'gosh', 'haha', 'hello', 'hey', 'hmm', 'huh', 'humph', 'hurray', 'oh', 'oh my', 'oops', 'ouch', 'ow', 'phew', 'phooey', 'pooh', 'pow', 'rats', 'shh', 'shoo', 'thanks', 'there', 'uh-huh', 'uh-oh', 'ugh', 'wahoo', 'well', 'whoa', 'whoops', 'wow', 'yeah', 'yes', 'yikes', 'yippee', 'yo', 'yuck' +] +export const adjectives = [ + 'abject', 'abrupt', 'absent', 'absurd', 'active', 'acute', 'adept', 'adroit', 'aerial', 'agile', 'airy', 'alert', 'aloof', 'amoral', 'amused', 'angry', 'apt', 'arch', 'ardent', 'artful', 'august', 'aural', 'avowed', 'awful', 'bad', 'banal', 'basic', 'bawdy', 'benign', 'bitter', 'bland', 'blank', 'bleak', 'blind', 'blithe', 'blunt', 'boyish', 'brave', 'breezy', 'brief', 'bright', 'broad', 'broken', 'busy', 'cagy', 'cm', 'candid', 'canny', 'carnal', 'casual', 'catty', 'caudal', 'chaste', 'cheeky', 'clear', 'clever', 'clinic', 'clumsy', 'coarse', 'cocky', 'cogent', 'cold', 'conic', 'coward', 'coy', 'cozy', 'crass', 'craven', 'crazy', 'creepy', 'crude', 'curt', 'cute', 'cynic', 'dainty', 'dark', 'dazed', 'dear', 'decent', 'deep', 'deft', 'demure', 'dense', 'dim', 'dire', 'dismal', 'dizzy', 'dogged', 'droll', 'dry', 'dull', 'eager', 'easy', 'eerie', 'equal', 'erect', 'erotic', 'ethic', 'even', 'evil', 'exact', 'exotic', 'faint', 'false', 'famous', 'fatal', 'faulty', 'feeble', 'firm', 'fishy', 'fixed', 'flabby', 'flashy', 'flat', 'fleet', 'flimsy', 'floppy', 'fluent', 'fluid', 'fond', 'foul', 'frail', 'frank', 'free', 'fresh', 'frisky', 'frugal', 'funny', 'fussy', 'futile', 'fuzzy', 'game', 'garish', 'gauche', 'gaudy', 'gawky', 'genial', 'gent', 'glad', 'glib', 'glum', 'grand', 'grave', 'great', 'greedy', 'grimy', 'groggy', 'gross', 'guilty', 'happy', 'hardy', 'harsh', 'hasty', 'hazy', 'heated', 'hectic', 'heroic', 'hoarse', 'honest', 'hot', 'huge', 'humane', 'humble', 'hungry', 'husky', 'icy', 'inept', 'insane', 'ireful', 'ironic', 'jaded', 'jaunty', 'jerky', 'jocose', 'joking', 'jolly', 'jovial', 'joyful', 'juicy', 'just', 'keen', 'lame', 'lavish', 'lax', 'lazy', 'lewd', 'light', 'limp', 'livid', 'logic', 'loose', 'loud', 'loving', 'loyal', 'lubber', 'lucid', 'lucky', 'lurid', 'lusty', 'mad', 'magic', 'manful', 'marked', 'mature', 'meager', 'mean', 'meek', 'menial', 'merry', 'messy', 'metric', 'mighty', 'mild', 'minute', 'miser', 'modest', 'moist', 'moody', 'moral', 'morbid', 'murky', 'music', 'mute', 'naive', 'naked', 'narrow', 'nasty', 'neat', 'nice', 'nimble', 'noble', 'noisy', 'normal', 'nosy', 'numb', 'oafish', 'opaque', 'pert', 'pesky', 'physic', 'pious', 'pithy', 'placid', 'plain', 'poetic', 'polite', 'poor', 'prim', 'prissy', 'proper', 'proud', 'public', 'pure', 'quaint', 'queer', 'quick', 'quiet', 'rabid', 'racy', 'raging', 'rakish', 'random', 'rank', 'rapid', 'rapt', 'rare', 'rash', 'raving', 'ready', 'regal', 'remote', 'rich', 'right', 'rigid', 'ripe', 'ritual', 'robust', 'rosy', 'rough', 'royal', 'rude', 'rueful', 'rugged', 'sad', 'safe', 'sane', 'saucy', 'savage', 'scant', 'secret', 'secure', 'sedate', 'serene', 'severe', 'sexy', 'sexual', 'shaky', 'sharp', 'shoddy', 'showy', 'shrewd', 'shy', 'silent', 'simple', 'skimpy', 'slack', 'sleazy', 'sleek', 'slick', 'slight', 'slow', 'smart', 'smooth', 'smug', 'snooty', 'snug', 'sober', 'soft', 'soggy', 'solemn', 'somber', 'sordid', 'sore', 'sound', 'sour', 'spry', 'square', 'staid', 'stark', 'static', 'steady', 'stern', 'stiff', 'stingy', 'stoic', 'stolid', 'stormy', 'stout', 'strict', 'strong', 'stuffy', 'stupid', 'suave', 'subtle', 'sudden', 'sudden', 'sulky', 'sullen', 'superb', 'supp', 'sure', 'swanky', 'swift', 'tacit', 'tacky', 'tame', 'tardy', 'tart', 'taut', 'tense', 'tepid', 'terse', 'testy', 'thick', 'thin', 'tidy', 'tight', 'timid', 'tonal', 'tough', 'tragic', 'trim', 'trite', 'true', 'trying', 'turgid', 'uneasy', 'unique', 'unkind', 'unsafe', 'urgent', 'useful', 'vague', 'vain', 'vexed', 'visual', 'vital', 'vivid', 'vocal', 'vulgar', 'wan', 'wanton', 'warm', 'weak', 'weird', 'wicked', 'wide', 'wild', 'wise', 'witty', 'woeful', 'wrong', 'wry' +] +export const verbed = new Proxy(verbs, { + get: (arr, prop) => { + // Check it's not a property + if (!(prop in [])) { + return getPastTense(arr[prop]) + } else { + return arr[prop] + } + } +}) diff --git a/qortal-ui-crypto/api.js b/qortal-ui-crypto/api.js index b2cfad3c..cc81dc9e 100644 --- a/qortal-ui-crypto/api.js +++ b/qortal-ui-crypto/api.js @@ -2,9 +2,8 @@ import { Sha256 } from 'asmcrypto.js' import Base58 from './api/deps/Base58' import { base58PublicKeyToAddress } from './api/wallet/base58PublicKeyToAddress' import { validateAddress } from './api/wallet/validateAddress' -import { decryptChatMessage } from './api/transactions/chat/decryptChatMessage'; -import _ from 'lodash'; - +import { decryptChatMessage } from './api/transactions/chat/decryptChatMessage' +import _ from 'lodash' window.Sha256 = Sha256 window.Base58 = Base58 @@ -14,7 +13,6 @@ window.validateAddress = validateAddress window.decryptChatMessage = decryptChatMessage export { initApi, store } from './api_deps.js' - export * from './api/deps/deps.js' export * from './api/api.js' export * from './api/registerUsername.js' diff --git a/qortal-ui-crypto/api/PhraseWallet.js b/qortal-ui-crypto/api/PhraseWallet.js index 64baa02b..41818a28 100644 --- a/qortal-ui-crypto/api/PhraseWallet.js +++ b/qortal-ui-crypto/api/PhraseWallet.js @@ -1,7 +1,7 @@ /* Copyright 2017-2018 @ irontiga and vbcs (original developer) */ -'use strict'; +'use strict' import Base58 from './deps/Base58.js' import { Sha256, Sha512 } from 'asmcrypto.js' import nacl from './deps/nacl-fast.js' @@ -10,200 +10,200 @@ import utils from './deps/utils.js' import { generateSaveWalletData } from './storeWallet.js' import publicKeyToAddress from './wallet/publicKeyToAddress.js' -import AltcoinHDWallet from "./bitcoin/AltcoinHDWallet"; +import AltcoinHDWallet from "./bitcoin/AltcoinHDWallet" export default class PhraseWallet { - constructor(seed, walletVersion) { + constructor(seed, walletVersion) { - this._walletVersion = walletVersion || 2 - this.seed = seed + this._walletVersion = walletVersion || 2 + this.seed = seed - this.savedSeedData = {} - this.hasBeenSaved = false - } + this.savedSeedData = {} + this.hasBeenSaved = false + } - set seed(seed) { - this._byteSeed = seed - this._base58Seed = Base58.encode(seed) + set seed(seed) { + this._byteSeed = seed + this._base58Seed = Base58.encode(seed) - this._addresses = [] + this._addresses = [] - this.genAddress(0) - } + this.genAddress(0) + } - getAddress(nonce) { - return this._addresses[nonce] - } + getAddress(nonce) { + return this._addresses[nonce] + } - get addresses() { - return this._addresses - } + get addresses() { + return this._addresses + } - get addressIDs() { - return this._addresses.map(addr => { - return addr.address - }) - } + get addressIDs() { + return this._addresses.map(addr => { + return addr.address + }) + } - get seed() { - return this._byteSeed - } + get seed() { + return this._byteSeed + } - addressExists(nonce) { - return this._addresses[nonce] != undefined - } + addressExists(nonce) { + return this._addresses[nonce] != undefined + } - _genAddressSeed(seed) { - let newSeed = new Sha512().process(seed).finish().result - newSeed = new Sha512().process(utils.appendBuffer(newSeed, seed)).finish().result - return newSeed - } + _genAddressSeed(seed) { + let newSeed = new Sha512().process(seed).finish().result + newSeed = new Sha512().process(utils.appendBuffer(newSeed, seed)).finish().result + return newSeed + } - genAddress(nonce) { - if (nonce >= this._addresses.length) { - this._addresses.length = nonce + 1 - } + genAddress(nonce) { + if (nonce >= this._addresses.length) { + this._addresses.length = nonce + 1 + } - if (this.addressExists(nonce)) { - return this.addresses[nonce] - } + if (this.addressExists(nonce)) { + return this.addresses[nonce] + } - const nonceBytes = utils.int32ToBytes(nonce) + const nonceBytes = utils.int32ToBytes(nonce) - let addrSeed = new Uint8Array() - addrSeed = utils.appendBuffer(addrSeed, nonceBytes) - addrSeed = utils.appendBuffer(addrSeed, this._byteSeed) - addrSeed = utils.appendBuffer(addrSeed, nonceBytes) + let addrSeed = new Uint8Array() + addrSeed = utils.appendBuffer(addrSeed, nonceBytes) + addrSeed = utils.appendBuffer(addrSeed, this._byteSeed) + addrSeed = utils.appendBuffer(addrSeed, nonceBytes) - if (this._walletVersion == 1) { - addrSeed = new Sha256().process( - new Sha256() - .process(addrSeed) - .finish() - .result - ).finish().result + if (this._walletVersion == 1) { + addrSeed = new Sha256().process( + new Sha256() + .process(addrSeed) + .finish() + .result + ).finish().result - addrSeed = this._byteSeed - } else { - addrSeed = this._genAddressSeed(addrSeed).slice(0, 32) - } + addrSeed = this._byteSeed + } else { + addrSeed = this._genAddressSeed(addrSeed).slice(0, 32) + } - const addrKeyPair = nacl.sign.keyPair.fromSeed(new Uint8Array(addrSeed)); + const addrKeyPair = nacl.sign.keyPair.fromSeed(new Uint8Array(addrSeed)); - const address = publicKeyToAddress(addrKeyPair.publicKey); - const qoraAddress = publicKeyToAddress(addrKeyPair.publicKey, true); + const address = publicKeyToAddress(addrKeyPair.publicKey); + const qoraAddress = publicKeyToAddress(addrKeyPair.publicKey, true); - // Create Bitcoin HD Wallet - const btcSeed = [...addrSeed]; - const btcWallet = new AltcoinHDWallet({ - mainnet: { - private: 0x0488ADE4, - public: 0x0488B21E, - prefix: 0 - }, - testnet: { - private: 0x04358394, - public: 0x043587CF, - prefix: 0x6F - } - }).createWallet(new Uint8Array(btcSeed), false); + // Create Bitcoin HD Wallet + const btcSeed = [...addrSeed]; + const btcWallet = new AltcoinHDWallet({ + mainnet: { + private: 0x0488ADE4, + public: 0x0488B21E, + prefix: 0 + }, + testnet: { + private: 0x04358394, + public: 0x043587CF, + prefix: 0x6F + } + }).createWallet(new Uint8Array(btcSeed), false); - // Create Litecoin HD Wallet - const ltcSeed = [...addrSeed]; - const ltcWallet = new AltcoinHDWallet({ - mainnet: { - private: 0x0488ADE4, - public: 0x0488B21E, - prefix: 0x30 - }, - testnet: { - private: 0x04358394, - public: 0x043587CF, - prefix: 0x6F - } - }).createWallet(new Uint8Array(ltcSeed), false, 'LTC'); + // Create Litecoin HD Wallet + const ltcSeed = [...addrSeed]; + const ltcWallet = new AltcoinHDWallet({ + mainnet: { + private: 0x0488ADE4, + public: 0x0488B21E, + prefix: 0x30 + }, + testnet: { + private: 0x04358394, + public: 0x043587CF, + prefix: 0x6F + } + }).createWallet(new Uint8Array(ltcSeed), false, 'LTC'); - // Create Dogecoin HD Wallet - const dogeSeed = [...addrSeed]; - const dogeWallet = new AltcoinHDWallet({ - mainnet: { - private: 0x02FAC398, - public: 0x02FACAFD, - prefix: 0x1E - }, - testnet: { - private: 0x04358394, - public: 0x043587CF, - prefix: 0x71 - } - }).createWallet(new Uint8Array(dogeSeed), false, 'DOGE'); + // Create Dogecoin HD Wallet + const dogeSeed = [...addrSeed]; + const dogeWallet = new AltcoinHDWallet({ + mainnet: { + private: 0x02FAC398, + public: 0x02FACAFD, + prefix: 0x1E + }, + testnet: { + private: 0x04358394, + public: 0x043587CF, + prefix: 0x71 + } + }).createWallet(new Uint8Array(dogeSeed), false, 'DOGE'); - // Create Digibyte HD Wallet - const dgbSeed = [...addrSeed]; - const dgbWallet = new AltcoinHDWallet({ - mainnet: { - private: 0x0488ADE4, - public: 0x0488B21E, - prefix: 0x1E - }, - testnet: { - private: 0x04358394, - public: 0x043587CF, - prefix: 0x7E - } - }).createWallet(new Uint8Array(dgbSeed), false, 'DGB'); + // Create Digibyte HD Wallet + const dgbSeed = [...addrSeed]; + const dgbWallet = new AltcoinHDWallet({ + mainnet: { + private: 0x0488ADE4, + public: 0x0488B21E, + prefix: 0x1E + }, + testnet: { + private: 0x04358394, + public: 0x043587CF, + prefix: 0x7E + } + }).createWallet(new Uint8Array(dgbSeed), false, 'DGB'); // Create Ravencoin HD Wallet - const rvnSeed = [...addrSeed]; - const rvnWallet = new AltcoinHDWallet({ - mainnet: { - private: 0x0488ADE4, - public: 0x0488B21E, - prefix: 0x3C - }, - testnet: { - private: 0x04358394, - public: 0x043587CF, - prefix: 0x6F - } - }).createWallet(new Uint8Array(rvnSeed), false, 'RVN'); + const rvnSeed = [...addrSeed]; + const rvnWallet = new AltcoinHDWallet({ + mainnet: { + private: 0x0488ADE4, + public: 0x0488B21E, + prefix: 0x3C + }, + testnet: { + private: 0x04358394, + public: 0x043587CF, + prefix: 0x6F + } + }).createWallet(new Uint8Array(rvnSeed), false, 'RVN'); - // Create Pirate Chain HD Wallet - const arrrSeed = [...addrSeed]; - const arrrWallet = new AltcoinHDWallet({ - mainnet: { - private: 0x0488ADE4, - public: 0x0488B21E, - prefix: [0x16, 0x9A] - }, - testnet: { - private: 0x04358394, - public: 0x043587CF, - prefix: [0x14, 0x51] - } - }).createWallet(new Uint8Array(arrrSeed), false, 'ARRR'); + // Create Pirate Chain HD Wallet + const arrrSeed = [...addrSeed]; + const arrrWallet = new AltcoinHDWallet({ + mainnet: { + private: 0x0488ADE4, + public: 0x0488B21E, + prefix: [0x16, 0x9A] + }, + testnet: { + private: 0x04358394, + public: 0x043587CF, + prefix: [0x14, 0x51] + } + }).createWallet(new Uint8Array(arrrSeed), false, 'ARRR'); - this._addresses[nonce] = { - address, - btcWallet, - ltcWallet, - dogeWallet, - dgbWallet, - rvnWallet, - arrrWallet, - qoraAddress, - keyPair: { - publicKey: addrKeyPair.publicKey, - privateKey: addrKeyPair.secretKey - }, - base58PublicKey: Base58.encode(addrKeyPair.publicKey), - seed: addrSeed, - nonce: nonce - } - return this._addresses[nonce] - } + this._addresses[nonce] = { + address, + btcWallet, + ltcWallet, + dogeWallet, + dgbWallet, + rvnWallet, + arrrWallet, + qoraAddress, + keyPair: { + publicKey: addrKeyPair.publicKey, + privateKey: addrKeyPair.secretKey + }, + base58PublicKey: Base58.encode(addrKeyPair.publicKey), + seed: addrSeed, + nonce: nonce + } + return this._addresses[nonce] + } - generateSaveWalletData(...args) { - return generateSaveWalletData(this, ...args) - } + generateSaveWalletData(...args) { + return generateSaveWalletData(this, ...args) + } } diff --git a/qortal-ui-crypto/api/api.js b/qortal-ui-crypto/api/api.js index bf40d58a..98da919b 100644 --- a/qortal-ui-crypto/api/api.js +++ b/qortal-ui-crypto/api/api.js @@ -1,9 +1,5 @@ export { request } from './fetch-request.js' - export { transactionTypes as transactions } from './transactions/transactions.js' - export { processTransaction, createTransaction, computeChatNonce, signChatTransaction, signArbitraryTransaction } from './createTransaction.js' - export { tradeBotCreateRequest, tradeBotRespondRequest, signTradeBotTxn, deleteTradeOffer, sendBtc, sendLtc, sendDoge, sendDgb, sendRvn, sendArrr } from './tradeRequest.js' - export { cancelAllOffers } from './transactions/trade-portal/tradeoffer/cancelAllOffers.js' diff --git a/qortal-ui-crypto/api/bitcoin/AltcoinHDWallet.js b/qortal-ui-crypto/api/bitcoin/AltcoinHDWallet.js index 0d416d54..421d19fb 100644 --- a/qortal-ui-crypto/api/bitcoin/AltcoinHDWallet.js +++ b/qortal-ui-crypto/api/bitcoin/AltcoinHDWallet.js @@ -1,11 +1,10 @@ 'use strict'; import Base58 from '../deps/Base58.js' import { Sha256, Sha512 } from 'asmcrypto.js' -import jsSHA from "jssha"; +import jsSHA from 'jssha' import RIPEMD160 from '../deps/ripemd160.js' import utils from '../deps/utils.js' -import { EllipticCurve, BigInteger } from './ecbn.js'; - +import { EllipticCurve, BigInteger } from './ecbn.js' export default class AltcoinHDWallet { @@ -101,14 +100,10 @@ export default class AltcoinHDWallet { this._tmasterPublicKey = '' - - - /** * Child Keys Derivation from the Parent Keys */ - /** * Child Private Key - 32 bytes */ @@ -145,13 +140,10 @@ export default class AltcoinHDWallet { this.xPublicChildKey = '' - - /** * Grand Child Keys Derivation from the Child Keys */ - /** * Grand Child Private Key - 32 bytes */ @@ -200,7 +192,6 @@ export default class AltcoinHDWallet { this._tlitecoinLegacyAddress = '' - /** * Wallet - Wallet Object (keys...) */ @@ -250,76 +241,69 @@ export default class AltcoinHDWallet { generateSeedHash(seed, isBIP44, indicator = null) { - - let buffer; + let buffer if (isBIP44) { buffer = utils.appendBuffer(seed.reverse(), utils.int32ToBytes(indicator)) } else { if(indicator !== null) { - const indicatorString = utils.stringtoUTF8Array(indicator); - buffer = utils.appendBuffer(seed.reverse(), indicatorString); + const indicatorString = utils.stringtoUTF8Array(indicator) + buffer = utils.appendBuffer(seed.reverse(), indicatorString) } else { - buffer = seed.reverse(); + buffer = seed.reverse() } } - const _reverseSeedHash = new Sha256().process(buffer).finish().result; - this.seedHash = new Sha512().process(utils.appendBuffer(seed, _reverseSeedHash)).finish().result; + const _reverseSeedHash = new Sha256().process(buffer).finish().result + this.seedHash = new Sha512().process(utils.appendBuffer(seed, _reverseSeedHash)).finish().result } generatePrivateKey(seedHash) { + const SECP256K1_CURVE_ORDER = new BigInteger("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141") - const SECP256K1_CURVE_ORDER = new BigInteger("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141"); + const privateKeyHash = seedHash.slice(0, 32) - const privateKeyHash = seedHash.slice(0, 32); - - this.seed58 = Base58.encode(privateKeyHash); + this.seed58 = Base58.encode(privateKeyHash) const _privateKeyHash = [...privateKeyHash] - let privateKeyBigInt = BigInteger.fromByteArrayUnsigned(_privateKeyHash); + let privateKeyBigInt = BigInteger.fromByteArrayUnsigned(_privateKeyHash) const privateKey = (privateKeyBigInt.mod(SECP256K1_CURVE_ORDER.subtract(BigInteger.ONE))).add(BigInteger.ONE) this.privateKey = privateKey.toByteArrayUnsigned() } generateChainCode(seedHash) { - - this.chainCode = new Sha256().process(seedHash.slice(32, 64)).finish().result; + this.chainCode = new Sha256().process(seedHash.slice(32, 64)).finish().result } generatePublicKey(privateKey) { - const _privateKey = [...privateKey] - const privateKeyBigInt = BigInteger.fromByteArrayUnsigned(_privateKey); + const privateKeyBigInt = BigInteger.fromByteArrayUnsigned(_privateKey) - const epCurve = EllipticCurve.getSECCurveByName("secp256k1"); - const curvePoints = epCurve.getG().multiply(privateKeyBigInt); + const epCurve = EllipticCurve.getSECCurveByName("secp256k1") + const curvePoints = epCurve.getG().multiply(privateKeyBigInt) - const x = curvePoints.getX().toBigInteger(); - const y = curvePoints.getY().toBigInteger(); + const x = curvePoints.getX().toBigInteger() + const y = curvePoints.getY().toBigInteger() /** * Deriving Uncompressed Public Key (65 bytes) * - * const publicKeyBytes = EllipticCurve.integerToBytes(x, 32); - * this.publicKey = publicKeyBytes.concat(EllipticCurve.integerToBytes(y, 32)); - * this.publicKey.unshift(0x04); // append point indicator + * const publicKeyBytes = EllipticCurve.integerToBytes(x, 32) + * this.publicKey = publicKeyBytes.concat(EllipticCurve.integerToBytes(y, 32)) + * this.publicKey.unshift(0x04) // append point indicator */ - // Compressed Public Key (33 bytes) this.publicKey = EllipticCurve.integerToBytes(x, 32) if (y.isEven()) { - this.publicKey.unshift(0x02) // append point indicator } else { - this.publicKey.unshift(0x03) // append point indicator } @@ -330,7 +314,6 @@ export default class AltcoinHDWallet { } generateMainnetMasterPrivateKey() { - // Serialization Variable const s = [] @@ -375,7 +358,6 @@ export default class AltcoinHDWallet { } generateMainnetMasterPublicKey() { - // Serialization Variable const s = [] @@ -495,19 +477,19 @@ export default class AltcoinHDWallet { // TODO: Make this more better in the future const path = 'm/0/0' - // let p = path.split('/'); + // let p = path.split('/') // Get Public kEY const derivePublicChildKey = () => { const _privateKey = [...this.childPrivateKey] - const privateKeyBigInt = BigInteger.fromByteArrayUnsigned(_privateKey); + const privateKeyBigInt = BigInteger.fromByteArrayUnsigned(_privateKey) - const epCurve = EllipticCurve.getSECCurveByName("secp256k1"); - const curvePoints = epCurve.getG().multiply(privateKeyBigInt); + const epCurve = EllipticCurve.getSECCurveByName("secp256k1") + const curvePoints = epCurve.getG().multiply(privateKeyBigInt) - const x = curvePoints.getX().toBigInteger(); - const y = curvePoints.getY().toBigInteger(); + const x = curvePoints.getX().toBigInteger() + const y = curvePoints.getY().toBigInteger() // Compressed Public Key (33 bytes) this.childPublicKey = EllipticCurve.integerToBytes(x, 32) @@ -533,15 +515,15 @@ export default class AltcoinHDWallet { const derivePrivateChildKey = (cI) => { - let ib = []; - ib.push((cI >> 24) & 0xff); - ib.push((cI >> 16) & 0xff); - ib.push((cI >> 8) & 0xff); - ib.push(cI & 0xff); + let ib = [] + ib.push((cI >> 24) & 0xff) + ib.push((cI >> 16) & 0xff) + ib.push((cI >> 8) & 0xff) + ib.push(cI & 0xff) - const s = [...this.publicKey].concat(ib); + const s = [...this.publicKey].concat(ib) - const _hmacSha512 = new jsSHA("SHA-512", "UINT8ARRAY", { numRounds: 1, hmacKey: { value: this.chainCode, format: "UINT8ARRAY" } }); + const _hmacSha512 = new jsSHA("SHA-512", "UINT8ARRAY", { numRounds: 1, hmacKey: { value: this.chainCode, format: "UINT8ARRAY" } }) _hmacSha512.update(new Uint8Array(s)) @@ -550,10 +532,10 @@ export default class AltcoinHDWallet { // SECP256k1 init - const epCurve = EllipticCurve.getSECCurveByName("secp256k1"); + const epCurve = EllipticCurve.getSECCurveByName("secp256k1") - const ki = IL.add(BigInteger.fromByteArrayUnsigned(this.privateKey)).mod(epCurve.getN()); // parse256(IL) + kpar (mod n) ==> ki + const ki = IL.add(BigInteger.fromByteArrayUnsigned(this.privateKey)).mod(epCurve.getN()) // parse256(IL) + kpar (mod n) ==> ki this.childPrivateKey = ki.toByteArrayUnsigned() // Call deriveExtendedPrivateChildKey @@ -577,10 +559,10 @@ export default class AltcoinHDWallet { s.push(...(this.publicKeyHash.slice(0, 4))) // Append Child Index - s.push(childIndex >>> 24); - s.push((childIndex >>> 16) & 0xff); - s.push((childIndex >>> 8) & 0xff); - s.push(childIndex & 0xff); + s.push(childIndex >>> 24) + s.push((childIndex >>> 16) & 0xff) + s.push((childIndex >>> 8) & 0xff) + s.push(childIndex & 0xff) // Append Chain Code s.push(...this.childChainCode) @@ -619,10 +601,10 @@ export default class AltcoinHDWallet { s.push(...(this.publicKeyHash.slice(0, 4))) // Append Child Index - s.push(childIndex >>> 24); - s.push((childIndex >>> 16) & 0xff); - s.push((childIndex >>> 8) & 0xff); - s.push(childIndex & 0xff); + s.push(childIndex >>> 24) + s.push((childIndex >>> 16) & 0xff) + s.push((childIndex >>> 8) & 0xff) + s.push(childIndex & 0xff) // Append Chain Code s.push(...this.childChainCode) @@ -654,24 +636,22 @@ export default class AltcoinHDWallet { const derivePublicGrandChildKey = () => { const _privateKey = [...this.grandChildPrivateKey] - const privateKeyBigInt = BigInteger.fromByteArrayUnsigned(_privateKey); + const privateKeyBigInt = BigInteger.fromByteArrayUnsigned(_privateKey) - const epCurve = EllipticCurve.getSECCurveByName("secp256k1"); - const curvePoints = epCurve.getG().multiply(privateKeyBigInt); + const epCurve = EllipticCurve.getSECCurveByName("secp256k1") + const curvePoints = epCurve.getG().multiply(privateKeyBigInt) - const x = curvePoints.getX().toBigInteger(); - const y = curvePoints.getY().toBigInteger(); + const x = curvePoints.getX().toBigInteger() + const y = curvePoints.getY().toBigInteger() // Compressed Public Key (33 bytes) this.grandChildPublicKey = EllipticCurve.integerToBytes(x, 32) if (y.isEven()) { - this.grandChildPublicKey.unshift(0x02) // append point indicator } else { - this.grandChildPublicKey.unshift(0x03) // append point indicator } @@ -729,16 +709,16 @@ export default class AltcoinHDWallet { const derivePrivateGrandChildKey = (cI, i) => { - let ib = []; - ib.push((cI >> 24) & 0xff); - ib.push((cI >> 16) & 0xff); - ib.push((cI >> 8) & 0xff); - ib.push(cI & 0xff); + let ib = [] + ib.push((cI >> 24) & 0xff) + ib.push((cI >> 16) & 0xff) + ib.push((cI >> 8) & 0xff) + ib.push(cI & 0xff) - const s = [...this.childPublicKey].concat(ib); + const s = [...this.childPublicKey].concat(ib) - const _hmacSha512 = new jsSHA("SHA-512", "UINT8ARRAY", { numRounds: 1, hmacKey: { value: this.childChainCode, format: "UINT8ARRAY" } }); + const _hmacSha512 = new jsSHA("SHA-512", "UINT8ARRAY", { numRounds: 1, hmacKey: { value: this.childChainCode, format: "UINT8ARRAY" } }) _hmacSha512.update(new Uint8Array(s)) @@ -746,10 +726,10 @@ export default class AltcoinHDWallet { this.grandChildChainCode = _hmacSha512.getHMAC('UINT8ARRAY').slice(32, 64) // IR according to the SPEC // SECP256k1 init - const epCurve = EllipticCurve.getSECCurveByName("secp256k1"); + const epCurve = EllipticCurve.getSECCurveByName("secp256k1") - const ki = IL.add(BigInteger.fromByteArrayUnsigned(this.childPrivateKey)).mod(epCurve.getN()); // parse256(IL) + kpar (mod n) ==> ki + const ki = IL.add(BigInteger.fromByteArrayUnsigned(this.childPrivateKey)).mod(epCurve.getN()) // parse256(IL) + kpar (mod n) ==> ki this.grandChildPrivateKey = ki.toByteArrayUnsigned() @@ -774,10 +754,10 @@ export default class AltcoinHDWallet { s.push(...(this.childPublicKeyHash.slice(0, 4))) // Append Child Index - s.push(childIndex >>> 24); - s.push((childIndex >>> 16) & 0xff); - s.push((childIndex >>> 8) & 0xff); - s.push(childIndex & 0xff); + s.push(childIndex >>> 24) + s.push((childIndex >>> 16) & 0xff) + s.push((childIndex >>> 8) & 0xff) + s.push(childIndex & 0xff) // Append Chain Code s.push(...this.grandChildChainCode) @@ -816,10 +796,10 @@ export default class AltcoinHDWallet { s.push(...(this.childPublicKeyHash.slice(0, 4))) // Append Child Index - s.push(childIndex >>> 24); - s.push((childIndex >>> 16) & 0xff); - s.push((childIndex >>> 8) & 0xff); - s.push(childIndex & 0xff); + s.push(childIndex >>> 24) + s.push((childIndex >>> 16) & 0xff) + s.push((childIndex >>> 8) & 0xff) + s.push(childIndex & 0xff) // Append Chain Code s.push(...this.grandChildChainCode) diff --git a/qortal-ui-crypto/api/constants.js b/qortal-ui-crypto/api/constants.js index a50fddd8..ae139416 100644 --- a/qortal-ui-crypto/api/constants.js +++ b/qortal-ui-crypto/api/constants.js @@ -1,156 +1,154 @@ -"use strict"; +'use strict' // Qortal TX types const TX_TYPES = { - 1: "Genesis", - 2: "Payment", - 3: "Name registration", - 4: "Name update", - 5: "Sell name", - 6: "Cancel sell name", - 7: "Buy name", - 8: "Create poll", - 9: "Vote in poll", - 10: "Arbitrary", - 11: "Issue asset", - 12: "Transfer asset", - 13: "Create asset order", - 14: "Cancel asset order", - 15: "Multi-payment transaction", - 16: "Deploy AT", - 17: "Message", - 18: "Chat", - 19: "Publicize", - 20: "Airdrop", - 21: "AT", - 22: "Create group", - 23: "Update group", - 24: "Add group admin", - 25: "Remove group admin", - 26: "Group ban", - 27: "Cancel group ban", - 28: "Group kick", - 29: "Group invite", - 30: "Cancel group invite", - 31: "Join group", - 32: "Leave group", - 33: "Group approval", - 34: "Set group", - 35: "Update asset", - 36: "Account flags", - 37: "Enable forging", - 38: "Reward share", - 39: "Account level", - 40: "Transfer privs", - 41: "Presence" + 1: "Genesis", + 2: "Payment", + 3: "Name registration", + 4: "Name update", + 5: "Sell name", + 6: "Cancel sell name", + 7: "Buy name", + 8: "Create poll", + 9: "Vote in poll", + 10: "Arbitrary", + 11: "Issue asset", + 12: "Transfer asset", + 13: "Create asset order", + 14: "Cancel asset order", + 15: "Multi-payment transaction", + 16: "Deploy AT", + 17: "Message", + 18: "Chat", + 19: "Publicize", + 20: "Airdrop", + 21: "AT", + 22: "Create group", + 23: "Update group", + 24: "Add group admin", + 25: "Remove group admin", + 26: "Group ban", + 27: "Cancel group ban", + 28: "Group kick", + 29: "Group invite", + 30: "Cancel group invite", + 31: "Join group", + 32: "Leave group", + 33: "Group approval", + 34: "Set group", + 35: "Update asset", + 36: "Account flags", + 37: "Enable forging", + 38: "Reward share", + 39: "Account level", + 40: "Transfer privs", + 41: "Presence" } // Qortal error codes const ERROR_CODES = { - 1: "Valid OK", - 2: "Invalid address", - 3: "Negative amount", - 4: "Nagative fee", - 5: "No balance", - 6: "Invalid reference", - 7: "Invalid time length", - 8: "Invalid value length", - 9: "Name already registered", - 10: "Name does not exist", - 11: "Invalid name owner", - 12: "Name already for sale", - 13: "Name not for sale", - 14: "Name buyer already owner", - 15: "Invalid amount", - 16: "Invalid seller", - 17: "Name not lowercase", - 18: "Invalid description length", - 19: "Invalid options length", - 20: "Invalid option length", - 21: "Duplicate option", - 22: "Poll already created", - 23: "Poll already has votes", - 24: "Poll does not exist", - 25: "Option does not exist", - 26: "Already voted for that option", - 27: "Invalid data length", - 28: "Invalid quantity", - 29: "Asset does not exist", - 30: "Invalid return", - 31: "Have equals want", - 32: "Order does not exist", - 33: "Invalid order creator", - 34: "Invalid payments length", - 35: "Negative price", - 36: "Invalid creation bytes", - 37: "Invalid tags length", - 38: "Invalid type length", - 39: "Invalid AT transaction", - 40: "Insufficient fee", - 41: "Asset does not match AT", + 1: "Valid OK", + 2: "Invalid address", + 3: "Negative amount", + 4: "Nagative fee", + 5: "No balance", + 6: "Invalid reference", + 7: "Invalid time length", + 8: "Invalid value length", + 9: "Name already registered", + 10: "Name does not exist", + 11: "Invalid name owner", + 12: "Name already for sale", + 13: "Name not for sale", + 14: "Name buyer already owner", + 15: "Invalid amount", + 16: "Invalid seller", + 17: "Name not lowercase", + 18: "Invalid description length", + 19: "Invalid options length", + 20: "Invalid option length", + 21: "Duplicate option", + 22: "Poll already created", + 23: "Poll already has votes", + 24: "Poll does not exist", + 25: "Option does not exist", + 26: "Already voted for that option", + 27: "Invalid data length", + 28: "Invalid quantity", + 29: "Asset does not exist", + 30: "Invalid return", + 31: "Have equals want", + 32: "Order does not exist", + 33: "Invalid order creator", + 34: "Invalid payments length", + 35: "Negative price", + 36: "Invalid creation bytes", + 37: "Invalid tags length", + 38: "Invalid type length", + 39: "Invalid AT transaction", + 40: "Insufficient fee", + 41: "Asset does not match AT", - 43: "Asset already exists", - 44: "Missing creator", - 45: "Timestamp too old", - 46: "Timestamp too new", - 47: "Too many unconfirmed", - 48: "Group already exists", - 49: "Group does not exist", - 50: "Invalid group owner", - 51: "Already group memeber", - 52: "Group owner can not leave", - 53: "Not group member", - 54: "Already group admin", - 55: "Not group admin", - 56: "Invalid lifetime", - 57: "Invite unknown", - 58: "Ban exists", - 59: "Ban unknown", - 60: "Banned from group", - 61: "Join request", - 62: "Invalid group approval threshold", - 63: "Group ID mismatch", - 64: "Invalid group ID", - 65: "Transaction unknown", - 66: "Transaction already confirmed", - 67: "Invalid TX group", - 68: "TX group ID mismatch", - 69: "Multiple names forbidden", - 70: "Invalid asset owner", - 71: "AT is finished", - 72: "No flag permission", - 73: "Not minting accout", + 43: "Asset already exists", + 44: "Missing creator", + 45: "Timestamp too old", + 46: "Timestamp too new", + 47: "Too many unconfirmed", + 48: "Group already exists", + 49: "Group does not exist", + 50: "Invalid group owner", + 51: "Already group memeber", + 52: "Group owner can not leave", + 53: "Not group member", + 54: "Already group admin", + 55: "Not group admin", + 56: "Invalid lifetime", + 57: "Invite unknown", + 58: "Ban exists", + 59: "Ban unknown", + 60: "Banned from group", + 61: "Join request", + 62: "Invalid group approval threshold", + 63: "Group ID mismatch", + 64: "Invalid group ID", + 65: "Transaction unknown", + 66: "Transaction already confirmed", + 67: "Invalid TX group", + 68: "TX group ID mismatch", + 69: "Multiple names forbidden", + 70: "Invalid asset owner", + 71: "AT is finished", + 72: "No flag permission", + 73: "Not minting accout", - 77: "Invalid rewardshare percent", - 78: "Public key unknown", - 79: "Invalid public key", - 80: "AT unknown", - 81: "AT already exists", - 82: "Group approval not required", - 83: "Group approval decided", - 84: "Maximum reward shares", - 85: "Transaction already exists", - 86: "No blockchain lock", - 87: "Order already closed", - 88: "Clock not synced", - 89: "Asset not spendable", - 90: "Account can not reward share", - 91: "Self share exists", - 92: "Account already exists", - 93: "Invalid group block delay", - 94: "Incorrect nonce", - 95: "Ivalid timestamp signature", - 96: "Address blocked", - 97: "Name Blocked", - 98: "Group approval required", - 99: "Account not transferable", + 77: "Invalid rewardshare percent", + 78: "Public key unknown", + 79: "Invalid public key", + 80: "AT unknown", + 81: "AT already exists", + 82: "Group approval not required", + 83: "Group approval decided", + 84: "Maximum reward shares", + 85: "Transaction already exists", + 86: "No blockchain lock", + 87: "Order already closed", + 88: "Clock not synced", + 89: "Asset not spendable", + 90: "Account can not reward share", + 91: "Self share exists", + 92: "Account already exists", + 93: "Invalid group block delay", + 94: "Incorrect nonce", + 95: "Ivalid timestamp signature", + 96: "Address blocked", + 97: "Name Blocked", + 98: "Group approval required", + 99: "Account not transferable", - 999: "Ivalid but ok", - 1000: "Not yet released." + 999: "Ivalid but ok", + 1000: "Not yet released." } -const CHAT_REFERENCE_FEATURE_TRIGGER_TIMESTAMP = 0 - // Qortal 8 decimals const QORT_DECIMALS = 1e8 @@ -160,6 +158,9 @@ const ADDRESS_VERSION = 58 // Proxy for api calls const PROXY_URL = "/proxy/" +// Chat reference timestamp +const CHAT_REFERENCE_FEATURE_TRIGGER_TIMESTAMP = 0 + // Used as a salt for all qora addresses. Salts used for storing your private keys in local storage will be randomly generated const STATIC_SALT = new Uint8Array([54, 190, 201, 206, 65, 29, 123, 129, 147, 231, 180, 166, 171, 45, 95, 165, 78, 200, 208, 194, 44, 207, 221, 146, 45, 238, 68, 68, 69, 102, 62, 6]) const BCRYPT_ROUNDS = 10 // Remember that the total work spent on key derivation is BCRYPT_ROUNDS * KDF_THREADS diff --git a/qortal-ui-crypto/api/createTransaction.js b/qortal-ui-crypto/api/createTransaction.js index d876b98a..2a56aa56 100644 --- a/qortal-ui-crypto/api/createTransaction.js +++ b/qortal-ui-crypto/api/createTransaction.js @@ -6,33 +6,33 @@ import signArbitrary from './transactions/arbitrary/signArbitrary.js' export const createTransaction = (type, keyPair, params) => { - const tx = new transactions[type]() - tx.keyPair = keyPair - Object.keys(params).forEach(param => { - tx[param] = params[param] - }) + const tx = new transactions[type]() + tx.keyPair = keyPair + Object.keys(params).forEach(param => { + tx[param] = params[param] + }) - return tx + return tx } // Compute Chat Nonce export const computeChatNonce = bytes => request('/chat/compute', { - method: 'POST', - body: Base58.encode(bytes) + method: 'POST', + body: Base58.encode(bytes) }) // Sign Chat Transactions export const signChatTransaction = (chatBytes, nonce, keyPair) => { - return signChat(chatBytes, nonce, keyPair) + return signChat(chatBytes, nonce, keyPair) } // Sign Arbitrary Transactions export const signArbitraryTransaction = (arbitraryBytesBase58, arbitraryBytesForSigningBase58, nonce, keyPair) => { - return signArbitrary(arbitraryBytesBase58, arbitraryBytesForSigningBase58, nonce, keyPair) + return signArbitrary(arbitraryBytesBase58, arbitraryBytesForSigningBase58, nonce, keyPair) } // Process Transactions export const processTransaction = bytes => request('/transactions/process', { - method: 'POST', - body: Base58.encode(bytes) + method: 'POST', + body: Base58.encode(bytes) }) diff --git a/qortal-ui-crypto/api/createWallet.js b/qortal-ui-crypto/api/createWallet.js index d342c7c3..ed978183 100644 --- a/qortal-ui-crypto/api/createWallet.js +++ b/qortal-ui-crypto/api/createWallet.js @@ -4,26 +4,26 @@ import Base58 from './deps/Base58.js' import { decryptStoredWallet } from './decryptStoredWallet.js' export const createWallet = async (sourceType, source, statusUpdateFn) => { - let version, seed + let version, seed - switch (sourceType) { - case 'phrase': - version = 2 - seed = await kdf(source.seedPhrase, void 0, statusUpdateFn) - break - case 'seed': - version = 1 - seed = Base58.decode(source.seed) - break - case 'storedWallet': - case 'backedUpSeed': - version = source.wallet.version - seed = await decryptStoredWallet(source.password, source.wallet, statusUpdateFn) - break - default: - throw 'sourceType ' + sourceType + ' not recognized' - } + switch (sourceType) { + case 'phrase': + version = 2 + seed = await kdf(source.seedPhrase, void 0, statusUpdateFn) + break + case 'seed': + version = 1 + seed = Base58.decode(source.seed) + break + case 'storedWallet': + case 'backedUpSeed': + version = source.wallet.version + seed = await decryptStoredWallet(source.password, source.wallet, statusUpdateFn) + break + default: + throw 'sourceType ' + sourceType + ' not recognized' + } - const wallet = new PhraseWallet(seed, version) - return wallet + const wallet = new PhraseWallet(seed, version) + return wallet } diff --git a/qortal-ui-crypto/api/decryptStoredWallet.js b/qortal-ui-crypto/api/decryptStoredWallet.js index e47a33b4..f98649cd 100644 --- a/qortal-ui-crypto/api/decryptStoredWallet.js +++ b/qortal-ui-crypto/api/decryptStoredWallet.js @@ -3,21 +3,21 @@ import { kdf } from './kdf.js' import { HmacSha512, AES_CBC } from 'asmcrypto.js' export const decryptStoredWallet = async (password, wallet, statusFn = () => { }) => { - statusFn('Decoding saved data') - const encryptedSeedBytes = Base58.decode(wallet.encryptedSeed) - const iv = Base58.decode(wallet.iv) - const salt = Base58.decode(wallet.salt) - statusFn('Generating decryption key') - const key = await kdf(password, salt, statusFn) - const encryptionKey = key.slice(0, 32) - const macKey = key.slice(32, 63) + statusFn('Decoding saved data') + const encryptedSeedBytes = Base58.decode(wallet.encryptedSeed) + const iv = Base58.decode(wallet.iv) + const salt = Base58.decode(wallet.salt) + statusFn('Generating decryption key') + const key = await kdf(password, salt, statusFn) + const encryptionKey = key.slice(0, 32) + const macKey = key.slice(32, 63) - statusFn('Checking key') - const mac = new HmacSha512(macKey).process(encryptedSeedBytes).finish().result - if (Base58.encode(mac) !== wallet.mac) { - throw new Error('Incorrect password') - } - statusFn('Decrypting') - const decryptedBytes = AES_CBC.decrypt(encryptedSeedBytes, encryptionKey, false, iv) - return decryptedBytes + statusFn('Checking key') + const mac = new HmacSha512(macKey).process(encryptedSeedBytes).finish().result + if (Base58.encode(mac) !== wallet.mac) { + throw new Error('Incorrect password') + } + statusFn('Decrypting') + const decryptedBytes = AES_CBC.decrypt(encryptedSeedBytes, encryptionKey, false, iv) + return decryptedBytes } diff --git a/qortal-ui-crypto/api/kdf.js b/qortal-ui-crypto/api/kdf.js index b94134ac..8c18888a 100644 --- a/qortal-ui-crypto/api/kdf.js +++ b/qortal-ui-crypto/api/kdf.js @@ -4,36 +4,36 @@ import { Sha512 } from 'asmcrypto.js' import utils from '../api/deps/utils.js' export const kdf = async (seed, salt, status = () => { }) => { - const state = store.getState() - const config = state.config - const workers = state.app.workers.workers - status('Waiting for workers to be ready') - await stateAwait(state => state.app.workers.ready) - status('Deriving key parts') - salt = new Uint8Array(salt) - const seedParts = await Promise.all(workers.map((worker, index) => { - const nonce = index - return worker.request('kdf', { - key: seed, - salt, - nonce, - staticSalt: config.crypto.staticSalt, - staticBcryptSalt: config.crypto.staticBcryptSalt - }).then(data => { - let jsonData - try { - jsonData = JSON.parse(data) - data = jsonData - } catch (e) { - // ... - } - if (seed !== data.key) throw new Error('Error, incorrect key. ' + seed + ' !== ' + data.key) - if (nonce !== data.nonce) throw new Error('Error, incorrect nonce') - return data.result - }) - })) - status('Combining key parts') - const result = new Sha512().process(utils.stringtoUTF8Array(config.crypto.staticSalt + seedParts.reduce((a, c) => a + c))).finish().result - status('Key is ready ') - return result + const state = store.getState() + const config = state.config + const workers = state.app.workers.workers + status('Waiting for workers to be ready') + await stateAwait(state => state.app.workers.ready) + status('Deriving key parts') + salt = new Uint8Array(salt) + const seedParts = await Promise.all(workers.map((worker, index) => { + const nonce = index + return worker.request('kdf', { + key: seed, + salt, + nonce, + staticSalt: config.crypto.staticSalt, + staticBcryptSalt: config.crypto.staticBcryptSalt + }).then(data => { + let jsonData + try { + jsonData = JSON.parse(data) + data = jsonData + } catch (e) { + // ... + } + if (seed !== data.key) throw new Error('Error, incorrect key. ' + seed + ' !== ' + data.key) + if (nonce !== data.nonce) throw new Error('Error, incorrect nonce') + return data.result + }) + })) + status('Combining key parts') + const result = new Sha512().process(utils.stringtoUTF8Array(config.crypto.staticSalt + seedParts.reduce((a, c) => a + c))).finish().result + status('Key is ready ') + return result } diff --git a/qortal-ui-crypto/api/registerUsername.js b/qortal-ui-crypto/api/registerUsername.js index c270c209..9715a078 100644 --- a/qortal-ui-crypto/api/registerUsername.js +++ b/qortal-ui-crypto/api/registerUsername.js @@ -8,39 +8,32 @@ const CHECK_LAST_REF_INTERVAL = 30 * 1000 // err 30 seconds const pendingAddresses = {} -// const config = store.getState().config -// const node = config.coin.node.api -// const baseUrl = node.url + node.tail - const checkLastRefs = () => { - Object.entries(pendingAddresses).forEach(([address, fn]) => { - // console.log(fn, address) - request('addresses/lastreference/' + address).then(res => { - if (res === 'false') return - fn(res) - delete pendingAddresses[address] - clearInterval(lastRefInterval) - }) - // fetch(baseUrl + 'addresses/lastreference/' + address) - // .then(async res => res.text()) - }) + Object.entries(pendingAddresses).forEach(([address, fn]) => { + request('addresses/lastreference/' + address).then(res => { + if (res === 'false') return + fn(res) + delete pendingAddresses[address] + clearInterval(lastRefInterval) + }) + }) } const lastRefInterval = setInterval(() => checkLastRefs(), CHECK_LAST_REF_INTERVAL) const callOnLastRef = (address, fn) => { - pendingAddresses[address] = fn + pendingAddresses[address] = fn } export const registerUsername = async ({ name, address, lastRef, keyPair }) => { - callOnLastRef(address, lastreference => { - const txBytes = createTransaction(TX_TYPE, keyPair, { - registrantPublicKey: keyPair.publicKey, - registrantAddress: address, - name, - value: address, - lastReference: lastreference - }) - processTransaction(txBytes).then(res => {}) - }) + callOnLastRef(address, lastreference => { + const txBytes = createTransaction(TX_TYPE, keyPair, { + registrantPublicKey: keyPair.publicKey, + registrantAddress: address, + name, + value: address, + lastReference: lastreference + }) + processTransaction(txBytes).then(res => { }) + }) } diff --git a/qortal-ui-crypto/api/storeWallet.js b/qortal-ui-crypto/api/storeWallet.js index eab5fa99..9d16c8af 100644 --- a/qortal-ui-crypto/api/storeWallet.js +++ b/qortal-ui-crypto/api/storeWallet.js @@ -1,33 +1,29 @@ import { HmacSha512, AES_CBC } from 'asmcrypto.js' import { kdf } from './kdf.js' -// import Base58 from '../qora/deps/Base58.js' import Base58 from './deps/Base58.js' const getRandomValues = window.crypto ? window.crypto.getRandomValues.bind(window.crypto) : window.msCrypto.getRandomValues.bind(window.msCrypto) export const generateSaveWalletData = async (wallet, password, kdfThreads, statusUpdateFn) => { - statusUpdateFn('Generating random values') - let iv = new Uint8Array(16) - getRandomValues(iv) - let salt = new Uint8Array(32) - getRandomValues(salt) // Can actually use a salt this time, as we can store the salt with the wallet - - // const key = PBKDF2_HMAC_SHA512.bytes(utils.stringtoUTF8Array(password), salt, PBKDF2_ROUNDS, 64) // 512bit key to be split in two for mac/encryption - const key = await kdf(password, salt, statusUpdateFn) - statusUpdateFn('Encrypting seed') - const encryptionKey = key.slice(0, 32) - const macKey = key.slice(32, 63) - const encryptedSeed = AES_CBC.encrypt(wallet._byteSeed, encryptionKey, false, iv) - // const mac = HmacSha512.bytes(encryptedSeed, macKey) - statusUpdateFn('Generating mac') - const mac = new HmacSha512(macKey).process(encryptedSeed).finish().result - return { - address0: wallet._addresses[0].address, - encryptedSeed: Base58.encode(encryptedSeed), - salt: Base58.encode(salt), - iv: Base58.encode(iv), - version: wallet._walletVersion, - mac: Base58.encode(mac), - kdfThreads - } + statusUpdateFn('Generating random values') + let iv = new Uint8Array(16) + getRandomValues(iv) + let salt = new Uint8Array(32) + getRandomValues(salt) + const key = await kdf(password, salt, statusUpdateFn) + statusUpdateFn('Encrypting seed') + const encryptionKey = key.slice(0, 32) + const macKey = key.slice(32, 63) + const encryptedSeed = AES_CBC.encrypt(wallet._byteSeed, encryptionKey, false, iv) + statusUpdateFn('Generating mac') + const mac = new HmacSha512(macKey).process(encryptedSeed).finish().result + return { + address0: wallet._addresses[0].address, + encryptedSeed: Base58.encode(encryptedSeed), + salt: Base58.encode(salt), + iv: Base58.encode(iv), + version: wallet._walletVersion, + mac: Base58.encode(mac), + kdfThreads + } } diff --git a/qortal-ui-crypto/api/tradeRequest.js b/qortal-ui-crypto/api/tradeRequest.js index f3ae00f0..797cbe5b 100644 --- a/qortal-ui-crypto/api/tradeRequest.js +++ b/qortal-ui-crypto/api/tradeRequest.js @@ -1,145 +1,140 @@ // Trade Bot -import TradeBotCreateRequest from './transactions/trade-portal/tradebot/TradeBotCreateRequest.js'; -import TradeBotRespondRequest from './transactions/trade-portal/tradebot/TradeBotRespondRequest.js'; +import TradeBotCreateRequest from './transactions/trade-portal/tradebot/TradeBotCreateRequest.js' +import TradeBotRespondRequest from './transactions/trade-portal/tradebot/TradeBotRespondRequest.js' import signTradeBotTransaction from './transactions/trade-portal/tradebot/signTradeBotTransaction.js' - -// Trade Offer -import DeleteTradeOffer from './transactions/trade-portal/tradeoffer/DeleteTradeOffer.js'; - +import DeleteTradeOffer from './transactions/trade-portal/tradeoffer/DeleteTradeOffer.js' import { request } from './fetch-request' - // TradeBotCreateRequest export const tradeBotCreateRequest = (requestObject) => { - const txn = new TradeBotCreateRequest().createTransaction(requestObject) - const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]; + const txn = new TradeBotCreateRequest().createTransaction(requestObject) + const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] - return request(`/crosschain/tradebot/create?apiKey=${myNode.apiKey}`, { - method: 'POST', - headers: { - 'Accept': 'text/plain', - 'Content-Type': 'application/json' - }, - body: JSON.stringify(txn) - }) + return request(`/crosschain/tradebot/create?apiKey=${myNode.apiKey}`, { + method: 'POST', + headers: { + 'Accept': 'text/plain', + 'Content-Type': 'application/json' + }, + body: JSON.stringify(txn) + }) } // TradeBotRespondRequest export const tradeBotRespondRequest = (requestObject) => { - const txn = new TradeBotRespondRequest().createTransaction(requestObject) - const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]; + const txn = new TradeBotRespondRequest().createTransaction(requestObject) + const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] - return request(`/crosschain/tradebot/respond?apiKey=${myNode.apiKey}`, { - method: 'POST', - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - }, - body: JSON.stringify(txn) - }) + return request(`/crosschain/tradebot/respond?apiKey=${myNode.apiKey}`, { + method: 'POST', + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json' + }, + body: JSON.stringify(txn) + }) } - // Sign Trade Transactions export const signTradeBotTxn = (unsignedTxn, keyPair) => { - return signTradeBotTransaction(unsignedTxn, keyPair) + return signTradeBotTransaction(unsignedTxn, keyPair) } // Delete Trade Offer export const deleteTradeOffer = (requestObject) => { - const txn = new DeleteTradeOffer().createTransaction(requestObject) - const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]; + const txn = new DeleteTradeOffer().createTransaction(requestObject) + const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] - return request(`/crosschain/tradeoffer?apiKey=${myNode.apiKey}`, { - method: 'DELETE', - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - }, - body: JSON.stringify(txn) - }) + return request(`/crosschain/tradeoffer?apiKey=${myNode.apiKey}`, { + method: 'DELETE', + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json' + }, + body: JSON.stringify(txn) + }) } // Send BTC export const sendBtc = (requestObject) => { - const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]; + const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] - return request(`/crosschain/btc/send?apiKey=${myNode.apiKey}`, { - method: 'POST', - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - }, - body: JSON.stringify(requestObject) - }) + return request(`/crosschain/btc/send?apiKey=${myNode.apiKey}`, { + method: 'POST', + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json' + }, + body: JSON.stringify(requestObject) + }) } // Send LTC export const sendLtc = (requestObject) => { - const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]; + const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] - return request(`/crosschain/ltc/send?apiKey=${myNode.apiKey}`, { - method: 'POST', - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - }, - body: JSON.stringify(requestObject) - }) + return request(`/crosschain/ltc/send?apiKey=${myNode.apiKey}`, { + method: 'POST', + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json' + }, + body: JSON.stringify(requestObject) + }) } // Send DOGE export const sendDoge = (requestObject) => { - const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]; + const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] - return request(`/crosschain/doge/send?apiKey=${myNode.apiKey}`, { - method: 'POST', - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - }, - body: JSON.stringify(requestObject) - }) + return request(`/crosschain/doge/send?apiKey=${myNode.apiKey}`, { + method: 'POST', + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json' + }, + body: JSON.stringify(requestObject) + }) } // Send DGB export const sendDgb = (requestObject) => { - const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]; + const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] - return request(`/crosschain/dgb/send?apiKey=${myNode.apiKey}`, { - method: 'POST', - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - }, - body: JSON.stringify(requestObject) - }) + return request(`/crosschain/dgb/send?apiKey=${myNode.apiKey}`, { + method: 'POST', + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json' + }, + body: JSON.stringify(requestObject) + }) } // Send RVN export const sendRvn = (requestObject) => { - const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]; + const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] - return request(`/crosschain/rvn/send?apiKey=${myNode.apiKey}`, { - method: 'POST', - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - }, - body: JSON.stringify(requestObject) - }) + return request(`/crosschain/rvn/send?apiKey=${myNode.apiKey}`, { + method: 'POST', + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json' + }, + body: JSON.stringify(requestObject) + }) } // Send ARRR export const sendArrr = (requestObject) => { - const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node]; + const myNode = window.parent.reduxStore.getState().app.nodeConfig.knownNodes[window.parent.reduxStore.getState().app.nodeConfig.node] - return request(`/crosschain/arrr/send?apiKey=${myNode.apiKey}`, { - method: 'POST', - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - }, - body: JSON.stringify(requestObject) - }) + return request(`/crosschain/arrr/send?apiKey=${myNode.apiKey}`, { + method: 'POST', + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json' + }, + body: JSON.stringify(requestObject) + }) } diff --git a/qortal-ui-crypto/api/transactions/AirdropTransaction.js b/qortal-ui-crypto/api/transactions/AirdropTransaction.js index 552e42e8..e23029a8 100644 --- a/qortal-ui-crypto/api/transactions/AirdropTransaction.js +++ b/qortal-ui-crypto/api/transactions/AirdropTransaction.js @@ -1,50 +1,35 @@ -'use strict'; +'use strict' import TransactionBase from './TransactionBase.js' import { QORT_DECIMALS } from '../constants.js' -// import { Sha256 } from 'asmcrypto.js/dist_es5/entry-export_all.js' export default class PaymentTransaction extends TransactionBase { - constructor () { - super() - this.type = 20 - this.amount = 42 * Math.pow(10, 8) - this.tests.push( - () => { - if (!(this._amount >= 0)) { - return 'Invalid amount ' + this._amount / QORT_DECIMALS - } - return true - }, - () => { - if (!(this._recipient instanceof Uint8Array && this._recipient.length == 25)) { - return 'Invalid recipient ' + Base58.encode(this._recipient) - } - return true - } - ) - } + constructor() { + super() + this.type = 20 + } - set recipient (recipient) { // Always Base58 encoded. Accepts Uint8Array or Base58 string. - this._recipient = recipient instanceof Uint8Array ? recipient : this.constructor.Base58.decode(recipient) - } - set amount (amount) { - this._amount = amount * QORT_DECIMALS - this._amountBytes = this.constructor.utils.int64ToBytes(amount) - } + set recipient(recipient) { + this._recipient = recipient instanceof Uint8Array ? recipient : this.constructor.Base58.decode(recipient) + } - set reference (seed) { - const sha = seed => new Sha512().process(seed).finish().result - let reference = sha(sha(seed)) - reference += reference - } + set amount(amount) { + this._amount = amount * QORT_DECIMALS + this._amountBytes = this.constructor.utils.int64ToBytes(amount) + } - get params () { - const params = super.params - params.push( - this._recipient, - this._amountBytes, - this._feeBytes - ) - return params - } + set reference(seed) { + const sha = seed => new Sha512().process(seed).finish().result + let reference = sha(sha(seed)) + reference += reference + } + + get params() { + const params = super.params + params.push( + this._recipient, + this._amountBytes, + this._feeBytes + ) + return params + } } diff --git a/qortal-ui-crypto/api/transactions/DelegationTransaction.js b/qortal-ui-crypto/api/transactions/DelegationTransaction.js index bc74502a..d2b670b8 100644 --- a/qortal-ui-crypto/api/transactions/DelegationTransaction.js +++ b/qortal-ui-crypto/api/transactions/DelegationTransaction.js @@ -1,31 +1,22 @@ -'use strict'; +'use strict' import TransactionBase from './TransactionBase.js' -// import { QORT_DECIMALS } from "../constants.js" // Not needed, no amount export default class DelegationTransaction extends TransactionBase { - constructor () { - super() - this.type = 18 - this.tests.push( - () => { - if (!(this._superNodeAddress instanceof Uint8Array && this._superNodeAddress.length == 25)) { - return 'Invalid recipient ' + Base58.encode(this._superNodeAddress) - } - return true - } - ) - } + constructor() { + super() + this.type = 18 + } - set superNodeAddress (superNodeAddress) { // Always Base58 encoded. Accepts Uint8Array or Base58 string. - this._superNodeAddress = superNodeAddress instanceof Uint8Array ? superNodeAddress : this.constructor.Base58.decode(superNodeAddress) - } + set superNodeAddress(superNodeAddress) { + this._superNodeAddress = superNodeAddress instanceof Uint8Array ? superNodeAddress : this.constructor.Base58.decode(superNodeAddress) + } - get params () { - const params = super.params - params.push( - this._superNodeAddress, - this._feeBytes - ) - return params - } + get params() { + const params = super.params + params.push( + this._superNodeAddress, + this._feeBytes + ) + return params + } } diff --git a/qortal-ui-crypto/api/transactions/MessageTransaction.js b/qortal-ui-crypto/api/transactions/MessageTransaction.js index f28a25fe..ea0e4079 100644 --- a/qortal-ui-crypto/api/transactions/MessageTransaction.js +++ b/qortal-ui-crypto/api/transactions/MessageTransaction.js @@ -1,95 +1,47 @@ -"use strict"; -import PaymentTransaction from "./PaymentTransaction.js" -import { QORT_DECIMALS } from "../constants.js" +'use strict' +import PaymentTransaction from './PaymentTransaction.js' +import { QORT_DECIMALS } from '../constants.js' -/* ==================================== -EXTEND THE PAYMENT TRANSACTION YOU CLOWN -====================================== */ +export default class MessageTransaction extends PaymentTransaction { + constructor() { + super() + this.type = 17 + this._key = this.constructor.utils.int64ToBytes(0); + this._isEncrypted = new Uint8Array(1); // Defaults to false + this._isText = new Uint8Array(1); // Defaults to false + } -export default class MessageTransaction extends PaymentTransaction{ - constructor(){ - super(); - this.type = 17 - this._key = this.constructor.utils.int64ToBytes(0); - this._isEncrypted = new Uint8Array(1); // Defaults to false - this._isText = new Uint8Array(1); // Defaults to false - } - - set message(message /* UTF8 String */){ - // ...yes? no? - this.messageText = message; - - // Not sure about encoding here... - //this._message = message instanceof Uint8Array ? message : this.constructor.Base58.decode(message); - this._message = this.constructor.utils.stringtoUTF8Array(message) - this._messageLength = this.constructor.utils.int64ToBytes(this._message.length) - } - set isEncrypted(isEncrypted){ - this._isEncrypted[0] = isEncrypted; - } - set isText(isText){ - this._isText[0] = isText; - } - get _params(){ - // dont extend super because paymentTrasaction is different - //const params = super.params; - return [ - this._typeBytes, - this._timestampBytes, - this._lastReference, - this._keyPair.publicKey, - this._recipient, - this._key, - this._amountBytes, - this._messageLength, - this._message, - this._isEncrypted, - this._isText, - this._feeBytes - ] - } + set message(message /* UTF8 String */) { + // ...yes? no? + this.messageText = message + + // Not sure about encoding here... + this._message = this.constructor.utils.stringtoUTF8Array(message) + this._messageLength = this.constructor.utils.int64ToBytes(this._message.length) + } + + set isEncrypted(isEncrypted) { + this._isEncrypted[0] = isEncrypted + } + + set isText(isText) { + this._isText[0] = isText + } + + get _params() { + return [ + this._typeBytes, + this._timestampBytes, + this._lastReference, + this._keyPair.publicKey, + this._recipient, + this._key, + this._amountBytes, + this._messageLength, + this._message, + this._isEncrypted, + this._isText, + this._feeBytes + ] + } } - -//"use strict"; -//function generateSignatureMessageTransaction(keyPair, lastReference, recipient, amount, fee, timestamp, message, isText, isEncrypted) => { -// const data = generateMessageTransactionBase(keyPair.publicKey, lastReference, recipient, amount, fee, timestamp, message, isText, isEncrypted); -// return nacl.sign.detached(data, keyPair.privateKey); -//} -// -//function generateMessageTransaction(keyPair, lastReference, recipient, amount, fee, timestamp, message, isText, isEncrypted, signature) => { -// return appendBuffer(generateMessageTransactionBase(keyPair.publicKey, lastReference, recipient, amount, fee, timestamp, message, isText, isEncrypted), -// signature); -//} -//function generateMessageTransactionBase(publicKey, lastReference, recipient, amount, fee, timestamp, message, isText, isEncrypted) => { -// txType = TYPES.MESSAGE_TRANSACTION; -// -// const typeBytes = int32ToBytes(txType); -// const timestampBytes = int64ToBytes(timestamp); -// const amountBytes = int64ToBytes(amount * 100000000); -// const feeBytes = int64ToBytes(fee * 100000000); -// const messageLength = int32ToBytes(message.length); -// const key = int64ToBytes(0); -// -// isTextB = new Uint8Array(1); -// isTextB[0] = isText; -// -// isEncryptedB = new Uint8Array(1); -// isEncryptedB[0] = isEncrypted; -// -// let data = new Uint8Array(); -// -// data = appendBuffer(data, typeBytes); -// data = appendBuffer(data, timestampBytes); -// data = appendBuffer(data, lastReference); -// data = appendBuffer(data, publicKey); -// data = appendBuffer(data, recipient); -// data = appendBuffer(data, key); -// data = appendBuffer(data, amountBytes); -// data = appendBuffer(data, messageLength); -// data = appendBuffer(data, message); -// data = appendBuffer(data, isEncryptedB); -// data = appendBuffer(data, isTextB); -// data = appendBuffer(data, feeBytes); -// -// return data; -//} \ No newline at end of file diff --git a/qortal-ui-crypto/api/transactions/PaymentTransaction.js b/qortal-ui-crypto/api/transactions/PaymentTransaction.js index 655ac285..bde396eb 100644 --- a/qortal-ui-crypto/api/transactions/PaymentTransaction.js +++ b/qortal-ui-crypto/api/transactions/PaymentTransaction.js @@ -1,80 +1,63 @@ -'use strict'; +'use strict' import TransactionBase from './TransactionBase.js' import Base58 from '../deps/Base58.js' import { store } from '../../api.js' export default class PaymentTransaction extends TransactionBase { - constructor() { - super() - this.type = 2 - this.tests.push( - () => { - if (!(this._amount >= 0)) { - return 'Invalid amount ' + this._amount / store.getState().config.coin.decimals - } - return true - }, - () => { - if (!(this._recipient instanceof Uint8Array && this._recipient.length == 25)) { - return 'Invalid recipient ' + Base58.encode(this._recipient) - } - return true - } - ) - } + constructor() { + super() + this.type = 2 + } - set recipient(recipient) { // Always Base58 encoded. Accepts Uint8Array or Base58 string. - this._recipient = recipient instanceof Uint8Array ? recipient : this.constructor.Base58.decode(recipient) - } + render(html) { + const conf = store.getState().config + return html` + + + + + + + + + ${this.recipientName ? html` + + + + + ` : ''} + + + + +
${this._dialogto}:
${this.dialogAddress} ${' '}-${Base58.encode(this._recipient)}
${this.dialogName} ${' '}-${this.recipientName}
${this._dialogamount}${this._amount / conf.coin.decimals} ${conf.coin.symbol}
+ ` + } - set dialogto(dialogto) { - this._dialogto = dialogto - } + set recipient(recipient) { + this._recipient = recipient instanceof Uint8Array ? recipient : this.constructor.Base58.decode(recipient) + } - set dialogamount(dialogamount) { - this._dialogamount = dialogamount - } - - set amount(amount) { - this._amount = Math.round(amount * store.getState().config.coin.decimals) - this._amountBytes = this.constructor.utils.int64ToBytes(this._amount) - } + set dialogto(dialogto) { + this._dialogto = dialogto + } - get params() { - const params = super.params - params.push( - this._recipient, - this._amountBytes, - this._feeBytes - ) - return params - } + set dialogamount(dialogamount) { + this._dialogamount = dialogamount + } - render(html) { - const conf = store.getState().config - return html` - - - - - - - - - - - ${this.recipientName ? html` - - - - - ` : ''} - - - - - -
${this._dialogto}:
${this.dialogAddress} ${' '}-${Base58.encode(this._recipient)}
${this.dialogName} ${' '}-${this.recipientName}
${this._dialogamount}${this._amount / conf.coin.decimals} ${conf.coin.symbol}
- ` - } + set amount(amount) { + this._amount = Math.round(amount * store.getState().config.coin.decimals) + this._amountBytes = this.constructor.utils.int64ToBytes(this._amount) + } + + get params() { + const params = super.params + params.push( + this._recipient, + this._amountBytes, + this._feeBytes + ) + return params + } } diff --git a/qortal-ui-crypto/api/transactions/PublicizeTransaction.js b/qortal-ui-crypto/api/transactions/PublicizeTransaction.js index 4f610b23..569f5e38 100644 --- a/qortal-ui-crypto/api/transactions/PublicizeTransaction.js +++ b/qortal-ui-crypto/api/transactions/PublicizeTransaction.js @@ -3,11 +3,11 @@ import ChatBase from "./chat/ChatBase.js" import { QORT_DECIMALS } from "../constants.js" export default class PublicizeTransaction extends ChatBase { - constructor() { - super(); - this.type = 19 - this.fee = 0 - } + constructor() { + super() + this.type = 19 + this.fee = 0 + } set proofOfWorkNonce(proofOfWorkNonce) { this._proofOfWorkNonce = this.constructor.utils.int32ToBytes(proofOfWorkNonce) diff --git a/qortal-ui-crypto/api/transactions/TransactionBase.js b/qortal-ui-crypto/api/transactions/TransactionBase.js index f61f1834..f41b7749 100644 --- a/qortal-ui-crypto/api/transactions/TransactionBase.js +++ b/qortal-ui-crypto/api/transactions/TransactionBase.js @@ -1,166 +1,168 @@ -'use strict'; +'use strict' import { TX_TYPES, QORT_DECIMALS } from '../constants.js' import nacl from '../deps/nacl-fast.js' import Base58 from '../deps/Base58.js' import utils from '../deps/utils.js' export default class TransactionBase { - static get utils() { - return utils - } - static get nacl() { - return nacl - } - static get Base58() { - return Base58 - } + static get utils() { + return utils + } + static get nacl() { + return nacl + } + static get Base58() { + return Base58 + } - constructor() { - // Defaults - this.fee = 0 - this.groupID = 0 - this.timestamp = Date.now() - this.tests = [ - () => { - if (!(this._type >= 1 && this._type in TX_TYPES)) { - return 'Invalid type: ' + this.type - } - return true - }, - () => { - if (this._fee < 0) { - return 'Invalid fee: ' + this._fee / QORT_DECIMALS - } - return true - }, - () => { - if (this._groupID < 0 || !Number.isInteger(this._groupID)) { - return 'Invalid groupID: ' + this._groupID - } - return true - }, - () => { - if (!(new Date(this._timestamp)).getTime() > 0) { - return 'Invalid timestamp: ' + this._timestamp - } - return true - }, - () => { - if (!(this._lastReference instanceof Uint8Array && this._lastReference.byteLength == 64)) { - if (this._lastReference == 0) { - // No prior transactions exist - return 'Invalid last reference. Please ensure that you have at least 0.001 QORT for the transaction fee.' - } - return 'Invalid last reference: ' + this._lastReference - } - return true - }, - () => { - if (!(this._keyPair)) { - return 'keyPair must be specified' - } - if (!(this._keyPair.publicKey instanceof Uint8Array && this._keyPair.publicKey.byteLength === 32)) { - return 'Invalid publicKey' - } - if (!(this._keyPair.privateKey instanceof Uint8Array && this._keyPair.privateKey.byteLength === 64)) { - return 'Invalid privateKey' - } - return true - } - ] - } + constructor() { + this.fee = 0 + this.groupID = 0 + this.timestamp = Date.now() + this.tests = [ + () => { + if (!(this._type >= 1 && this._type in TX_TYPES)) { + return 'Invalid type: ' + this.type + } + return true + }, + () => { + if (this._fee < 0) { + return 'Invalid fee: ' + this._fee / QORT_DECIMALS + } + return true + }, + () => { + if (this._groupID < 0 || !Number.isInteger(this._groupID)) { + return 'Invalid groupID: ' + this._groupID + } + return true + }, + () => { + if (!(new Date(this._timestamp)).getTime() > 0) { + return 'Invalid timestamp: ' + this._timestamp + } + return true + }, + () => { + if (!(this._lastReference instanceof Uint8Array && this._lastReference.byteLength == 64)) { + if (this._lastReference == 0) { + return 'Invalid last reference. Please ensure that you have at least 0.001 QORT for the transaction fee.' + } + return 'Invalid last reference: ' + this._lastReference + } + return true + }, + () => { + if (!(this._keyPair)) { + return 'keyPair must be specified' + } + if (!(this._keyPair.publicKey instanceof Uint8Array && this._keyPair.publicKey.byteLength === 32)) { + return 'Invalid publicKey' + } + if (!(this._keyPair.privateKey instanceof Uint8Array && this._keyPair.privateKey.byteLength === 64)) { + return 'Invalid privateKey' + } + return true + } + ] + } - set keyPair(keyPair) { - this._keyPair = keyPair - } - set type(type) { - this.typeText = TX_TYPES[type] - this._type = type - this._typeBytes = this.constructor.utils.int32ToBytes(this._type) - } - set groupID(groupID) { - this._groupID = groupID - this._groupIDBytes = this.constructor.utils.int32ToBytes(this._groupID) - } - set timestamp(timestamp) { - this._timestamp = timestamp - this._timestampBytes = this.constructor.utils.int64ToBytes(this._timestamp) - } - set fee(fee) { - this._fee = fee * QORT_DECIMALS - this._feeBytes = this.constructor.utils.int64ToBytes(this._fee) - } - set lastReference(lastReference) { // Always Base58 encoded. Accepts Uint8Array or Base58 string. - // lastReference could be a string or an Uint8Array - this._lastReference = lastReference instanceof Uint8Array ? lastReference : this.constructor.Base58.decode(lastReference) - } - get params() { - return [ - this._typeBytes, - this._timestampBytes, - this._groupIDBytes, - this._lastReference, - this._keyPair.publicKey - ] - } - get signedBytes() { - if (!this._signedBytes) { - this.sign() - } - return this._signedBytes - } + render(html) { + return html`render method to display requested transaction info` + } - // render function but NOT lit element - render(html) { - return html`render method to display requested transaction info` - } + set keyPair(keyPair) { + this._keyPair = keyPair + } - validParams() { - let finalResult = { - valid: true - } - // const valid = - this.tests.some(test => { - const result = test() - if (result !== true) { - finalResult = { - valid: false, - message: result - } - return true // exists the loop - } - }) - return finalResult - } + set type(type) { + this.typeText = TX_TYPES[type] + this._type = type + this._typeBytes = this.constructor.utils.int32ToBytes(this._type) + } - generateBase() { - const isValid = this.validParams() - if (!isValid.valid) { - throw new Error(isValid.message) - } - let result = new Uint8Array() + set groupID(groupID) { + this._groupID = groupID + this._groupIDBytes = this.constructor.utils.int32ToBytes(this._groupID) + } - this.params.forEach(item => { - result = this.constructor.utils.appendBuffer(result, item) - }) + set timestamp(timestamp) { + this._timestamp = timestamp + this._timestampBytes = this.constructor.utils.int64ToBytes(this._timestamp) + } - this._base = result - return result - } + set fee(fee) { + this._fee = fee * QORT_DECIMALS + this._feeBytes = this.constructor.utils.int64ToBytes(this._fee) + } - sign() { - if (!this._keyPair) { - throw new Error('keyPair not defined') - } + set lastReference(lastReference) { + this._lastReference = lastReference instanceof Uint8Array ? lastReference : this.constructor.Base58.decode(lastReference) + } - if (!this._base) { - this.generateBase() - } + get params() { + return [ + this._typeBytes, + this._timestampBytes, + this._groupIDBytes, + this._lastReference, + this._keyPair.publicKey + ] + } - this._signature = this.constructor.nacl.sign.detached(this._base, this._keyPair.privateKey) + get signedBytes() { + if (!this._signedBytes) { + this.sign() + } + return this._signedBytes + } - this._signedBytes = this.constructor.utils.appendBuffer(this._base, this._signature) + validParams() { + let finalResult = { + valid: true + } + this.tests.some(test => { + const result = test() + if (result !== true) { + finalResult = { + valid: false, + message: result + } + return true // exists the loop + } + }) + return finalResult + } - return this._signature - } + generateBase() { + const isValid = this.validParams() + if (!isValid.valid) { + throw new Error(isValid.message) + } + let result = new Uint8Array() + + this.params.forEach(item => { + result = this.constructor.utils.appendBuffer(result, item) + }) + + this._base = result + return result + } + + sign() { + if (!this._keyPair) { + throw new Error('keyPair not defined') + } + + if (!this._base) { + this.generateBase() + } + + this._signature = this.constructor.nacl.sign.detached(this._base, this._keyPair.privateKey) + + this._signedBytes = this.constructor.utils.appendBuffer(this._base, this._signature) + + return this._signature + } } diff --git a/qortal-ui-crypto/api/transactions/TransferPrivsTransaction.js b/qortal-ui-crypto/api/transactions/TransferPrivsTransaction.js index f12d837f..858ac26a 100644 --- a/qortal-ui-crypto/api/transactions/TransferPrivsTransaction.js +++ b/qortal-ui-crypto/api/transactions/TransferPrivsTransaction.js @@ -1,42 +1,42 @@ -'use strict'; +'use strict' import TransactionBase from './TransactionBase.js' import Base58 from '../deps/Base58.js' import { store } from '../../api.js' import { QORT_DECIMALS } from '../constants.js' export default class TransferPrivsTransaction extends TransactionBase { - constructor() { - super() - this.type = 40 - } + constructor() { + super() + this.type = 40 + } - render(html) { - const conf = store.getState().config - return html` + render(html) { + const conf = store.getState().config + return html` Are you sure to transfer privileges to this account ?
${this.theRecipient}
On pressing confirm, the transfer privileges request will be sent! ` - } + } - set recipient(recipient) { - this._recipient = recipient instanceof Uint8Array ? recipient : this.constructor.Base58.decode(recipient) - this.theRecipient = recipient - } + set recipient(recipient) { + this._recipient = recipient instanceof Uint8Array ? recipient : this.constructor.Base58.decode(recipient) + this.theRecipient = recipient + } - set fee(fee) { - this._fee = fee * QORT_DECIMALS - this._feeBytes = this.constructor.utils.int64ToBytes(this._fee) - } + set fee(fee) { + this._fee = fee * QORT_DECIMALS + this._feeBytes = this.constructor.utils.int64ToBytes(this._fee) + } - get params() { - const params = super.params - params.push( - this._recipient, - this._feeBytes - ) - return params - } -} \ No newline at end of file + get params() { + const params = super.params + params.push( + this._recipient, + this._feeBytes + ) + return params + } +} diff --git a/qortal-ui-crypto/api/transactions/arbitrary/signArbitrary.js b/qortal-ui-crypto/api/transactions/arbitrary/signArbitrary.js index 47f37f81..84ed0638 100644 --- a/qortal-ui-crypto/api/transactions/arbitrary/signArbitrary.js +++ b/qortal-ui-crypto/api/transactions/arbitrary/signArbitrary.js @@ -2,38 +2,37 @@ import nacl from '../../deps/nacl-fast.js' import utils from '../../deps/utils.js' import Base58 from '../../deps/Base58.js' - const signArbitrary = (arbitraryBytesBase58, arbitraryBytesForSigningBase58, nonce, keyPair) => { - if (!arbitraryBytesBase58) { - throw new Error('ArbitraryBytesBase58 not defined') - } + if (!arbitraryBytesBase58) { + throw new Error('ArbitraryBytesBase58 not defined') + } - if (!nonce) { - throw new Error('Nonce not defined') - } + if (!nonce) { + throw new Error('Nonce not defined') + } - if (!keyPair) { - throw new Error('keyPair not defined') - } + if (!keyPair) { + throw new Error('keyPair not defined') + } - const arbitraryBytes = Base58.decode(arbitraryBytesBase58) - const _arbitraryBytesBuffer = Object.keys(arbitraryBytes).map(function (key) { return arbitraryBytes[key]; }); - const arbitraryBytesBuffer = new Uint8Array(_arbitraryBytesBuffer) + const arbitraryBytes = Base58.decode(arbitraryBytesBase58) + const _arbitraryBytesBuffer = Object.keys(arbitraryBytes).map(function (key) { return arbitraryBytes[key]; }) + const arbitraryBytesBuffer = new Uint8Array(_arbitraryBytesBuffer) - const arbitraryBytesForSigning = Base58.decode(arbitraryBytesForSigningBase58) - const _arbitraryBytesForSigningBuffer = Object.keys(arbitraryBytesForSigning).map(function (key) { return arbitraryBytesForSigning[key]; }); - const arbitraryBytesForSigningBuffer = new Uint8Array(_arbitraryBytesForSigningBuffer) + const arbitraryBytesForSigning = Base58.decode(arbitraryBytesForSigningBase58) + const _arbitraryBytesForSigningBuffer = Object.keys(arbitraryBytesForSigning).map(function (key) { return arbitraryBytesForSigning[key]; }) + const arbitraryBytesForSigningBuffer = new Uint8Array(_arbitraryBytesForSigningBuffer) - const _nonce = utils.int32ToBytes(nonce) - arbitraryBytesBuffer.set(_nonce, 112) - arbitraryBytesForSigningBuffer.set(_nonce, 112) + const _nonce = utils.int32ToBytes(nonce) + arbitraryBytesBuffer.set(_nonce, 112) + arbitraryBytesForSigningBuffer.set(_nonce, 112) - const signature = nacl.sign.detached(arbitraryBytesForSigningBuffer, keyPair.privateKey) + const signature = nacl.sign.detached(arbitraryBytesForSigningBuffer, keyPair.privateKey) - const signedBytes = utils.appendBuffer(arbitraryBytesBuffer, signature) + const signedBytes = utils.appendBuffer(arbitraryBytesBuffer, signature) - return signedBytes + return signedBytes } export default signArbitrary diff --git a/qortal-ui-crypto/api/transactions/arbitraryV3.js b/qortal-ui-crypto/api/transactions/arbitraryV3.js index 5d62000a..2c2536af 100644 --- a/qortal-ui-crypto/api/transactions/arbitraryV3.js +++ b/qortal-ui-crypto/api/transactions/arbitraryV3.js @@ -1,42 +1,37 @@ -"use strict"; -/* -TO DO -*/ +'use strict' + (function () { + function generateSignatureArbitraryTransactionV3(keyPair, lastReference, service, arbitraryData, fee, timestamp) => { + const data = generateArbitraryTransactionV3Base(keyPair.publicKey, lastReference, service, arbitraryData, fee, timestamp) + return nacl.sign.detached(data, keyPair.privateKey) + } -(function(){ - function generateSignatureArbitraryTransactionV3(keyPair, lastReference, service, arbitraryData, fee, timestamp) => { - const data = generateArbitraryTransactionV3Base(keyPair.publicKey, lastReference, service, arbitraryData, fee, timestamp); - return nacl.sign.detached(data, keyPair.privateKey); - } + function generateArbitraryTransactionV3(keyPair, lastReference, service, arbitraryData, fee, timestamp, signature) => { + return appendBuffer(generateArbitraryTransactionV3Base(keyPair.publicKey, lastReference, service, arbitraryData, fee, timestamp), signature) + } - function generateArbitraryTransactionV3(keyPair, lastReference, service, arbitraryData, fee, timestamp, signature) => { - return appendBuffer(generateArbitraryTransactionV3Base(keyPair.publicKey, lastReference, service, arbitraryData, fee, timestamp), - signature); - } + function generateArbitraryTransactionV3Base(publicKey, lastReference, service, arbitraryData, fee, timestamp) => { + const txType = TYPES.ARBITRARY_TRANSACTION + const typeBytes = int32ToBytes(txType) + const timestampBytes = int64ToBytes(timestamp) + const feeBytes = int64ToBytes(fee * 100000000) + const serviceBytes = int32ToBytes(service) + const dataSizeBytes = int32ToBytes(arbitraryData.length) + const paymentsLengthBytes = int32ToBytes(0) // Support payments - not yet. - function generateArbitraryTransactionV3Base(publicKey, lastReference, service, arbitraryData, fee, timestamp) => { - const txType = TYPES.ARBITRARY_TRANSACTION; - const typeBytes = int32ToBytes(txType); - const timestampBytes = int64ToBytes(timestamp); - const feeBytes = int64ToBytes(fee * 100000000); - const serviceBytes = int32ToBytes(service); - const dataSizeBytes = int32ToBytes(arbitraryData.length); - const paymentsLengthBytes = int32ToBytes(0); // Support payments - not yet. + var data = new Uint8Array() - var data = new Uint8Array(); + data = appendBuffer(data, typeBytes) + data = appendBuffer(data, timestampBytes) + data = appendBuffer(data, lastReference) + data = appendBuffer(data, publicKey) + data = appendBuffer(data, paymentsLengthBytes) + // Here it is necessary to insert the payments, if there are + data = appendBuffer(data, serviceBytes) + data = appendBuffer(data, dataSizeBytes) + data = appendBuffer(data, arbitraryData) + data = appendBuffer(data, feeBytes) - data = appendBuffer(data, typeBytes); - data = appendBuffer(data, timestampBytes); - data = appendBuffer(data, lastReference); - data = appendBuffer(data, publicKey); - data = appendBuffer(data, paymentsLengthBytes); - // Here it is necessary to insert the payments, if there are - data = appendBuffer(data, serviceBytes); - data = appendBuffer(data, dataSizeBytes); - data = appendBuffer(data, arbitraryData); - data = appendBuffer(data, feeBytes); - - return data; - } -}()) \ No newline at end of file + return data + } + }()) diff --git a/qortal-ui-crypto/api/transactions/chat/ChatBase.js b/qortal-ui-crypto/api/transactions/chat/ChatBase.js index 3a81d3f2..240c9068 100644 --- a/qortal-ui-crypto/api/transactions/chat/ChatBase.js +++ b/qortal-ui-crypto/api/transactions/chat/ChatBase.js @@ -1,4 +1,4 @@ -'use strict'; +'use strict' import { TX_TYPES, QORT_DECIMALS } from '../../constants.js' import nacl from '../../deps/nacl-fast.js' import Base58 from '../../deps/Base58.js' @@ -67,28 +67,33 @@ export default class ChatBase { set keyPair(keyPair) { this._keyPair = keyPair } + set type(type) { this.typeText = TX_TYPES[type] this._type = type this._typeBytes = this.constructor.utils.int32ToBytes(this._type) } + set groupID(groupID) { this._groupID = groupID this._groupIDBytes = this.constructor.utils.int32ToBytes(this._groupID) } + set timestamp(timestamp) { this._timestamp = timestamp this._timestampBytes = this.constructor.utils.int64ToBytes(this._timestamp) } + set fee(fee) { this._fee = fee * QORT_DECIMALS this._feeBytes = this.constructor.utils.int64ToBytes(this._fee) } + set lastReference(lastReference) { this._lastReference = lastReference instanceof Uint8Array ? lastReference : this.constructor.Base58.decode(lastReference) } - get params() { + get params() { return [ this._typeBytes, this._timestampBytes, @@ -99,7 +104,6 @@ export default class ChatBase { } get chatBytes() { - const isValid = this.validParams() if (!isValid.valid) { throw new Error(isValid.message) diff --git a/qortal-ui-crypto/api/transactions/chat/ChatTransaction.js b/qortal-ui-crypto/api/transactions/chat/ChatTransaction.js index d368e8ca..d6313924 100644 --- a/qortal-ui-crypto/api/transactions/chat/ChatTransaction.js +++ b/qortal-ui-crypto/api/transactions/chat/ChatTransaction.js @@ -1,4 +1,4 @@ -"use strict"; +'use strict' import ChatBase from "./ChatBase.js" import nacl from '../../deps/nacl-fast.js' import ed2curve from '../../deps/ed2curve.js' @@ -7,92 +7,86 @@ import { CHAT_REFERENCE_FEATURE_TRIGGER_TIMESTAMP } from '../../constants.js' export default class ChatTransaction extends ChatBase { - constructor() { - super(); - this.type = 18 - this.fee = 0 - } + constructor() { + super() + this.type = 18 + this.fee = 0 + } - set recipientPublicKey(recipientPublicKey) { - this._base58RecipientPublicKey = recipientPublicKey instanceof Uint8Array ? this.constructor.Base58.encode(recipientPublicKey) : recipientPublicKey - this._recipientPublicKey = this.constructor.Base58.decode(this._base58RecipientPublicKey) + set recipientPublicKey(recipientPublicKey) { + this._base58RecipientPublicKey = recipientPublicKey instanceof Uint8Array ? this.constructor.Base58.encode(recipientPublicKey) : recipientPublicKey + this._recipientPublicKey = this.constructor.Base58.decode(this._base58RecipientPublicKey) + } - } + set proofOfWorkNonce(proofOfWorkNonce) { + this._proofOfWorkNonce = this.constructor.utils.int32ToBytes(proofOfWorkNonce) + } - set proofOfWorkNonce(proofOfWorkNonce) { - this._proofOfWorkNonce = this.constructor.utils.int32ToBytes(proofOfWorkNonce) - } + set recipient(recipient) { + this._recipient = recipient instanceof Uint8Array ? recipient : this.constructor.Base58.decode(recipient) + this._hasReceipient = new Uint8Array(1) + this._hasReceipient[0] = 1 + } + set hasChatReference(hasChatReference) { + this._hasChatReference = new Uint8Array(1) + this._hasChatReference[0] = hasChatReference + } - set recipient(recipient) { - this._recipient = recipient instanceof Uint8Array ? recipient : this.constructor.Base58.decode(recipient) - this._hasReceipient = new Uint8Array(1) - this._hasReceipient[0] = 1 - } + set chatReference(chatReference) { + this._chatReference = chatReference instanceof Uint8Array ? chatReference : this.constructor.Base58.decode(chatReference) + } - set hasChatReference(hasChatReference) { - this._hasChatReference = new Uint8Array(1) - this._hasChatReference[0] = hasChatReference - } + set message(message) { + this.messageText = message; + this._message = this.constructor.utils.stringtoUTF8Array(message) + this._messageLength = this.constructor.utils.int32ToBytes(this._message.length) + } - set chatReference(chatReference) { - this._chatReference = chatReference instanceof Uint8Array ? chatReference : this.constructor.Base58.decode(chatReference) - } + set isEncrypted(isEncrypted) { + this._isEncrypted = new Uint8Array(1) + this._isEncrypted[0] = isEncrypted - set message(message) { + if (isEncrypted === 1) { + const convertedPrivateKey = ed2curve.convertSecretKey(this._keyPair.privateKey) + const convertedPublicKey = ed2curve.convertPublicKey(this._recipientPublicKey) + const sharedSecret = new Uint8Array(32) + nacl.lowlevel.crypto_scalarmult(sharedSecret, convertedPrivateKey, convertedPublicKey) - this.messageText = message; + this._chatEncryptionSeed = new Sha256().process(sharedSecret).finish().result + this._encryptedMessage = nacl.secretbox(this._message, this._lastReference.slice(0, 24), this._chatEncryptionSeed) + } - this._message = this.constructor.utils.stringtoUTF8Array(message) - this._messageLength = this.constructor.utils.int32ToBytes(this._message.length) - } + this._myMessage = isEncrypted === 1 ? this._encryptedMessage : this._message + this._myMessageLenth = isEncrypted === 1 ? this.constructor.utils.int32ToBytes(this._myMessage.length) : this._messageLength + } - set isEncrypted(isEncrypted) { - this._isEncrypted = new Uint8Array(1); - this._isEncrypted[0] = isEncrypted; + set isText(isText) { + this._isText = new Uint8Array(1) + this._isText[0] = isText + } - if (isEncrypted === 1) { - const convertedPrivateKey = ed2curve.convertSecretKey(this._keyPair.privateKey) - const convertedPublicKey = ed2curve.convertPublicKey(this._recipientPublicKey) - const sharedSecret = new Uint8Array(32); - nacl.lowlevel.crypto_scalarmult(sharedSecret, convertedPrivateKey, convertedPublicKey); + get params() { + const params = super.params + params.push( + this._proofOfWorkNonce, + this._hasReceipient, + this._recipient, + this._myMessageLenth, + this._myMessage, + this._isEncrypted, + this._isText, + this._feeBytes + ) - this._chatEncryptionSeed = new Sha256().process(sharedSecret).finish().result - this._encryptedMessage = nacl.secretbox(this._message, this._lastReference.slice(0, 24), this._chatEncryptionSeed) - } + // After the feature trigger timestamp we need to include chat reference + if (new Date(this._timestamp).getTime() >= CHAT_REFERENCE_FEATURE_TRIGGER_TIMESTAMP) { + params.push(this._hasChatReference) - this._myMessage = isEncrypted === 1 ? this._encryptedMessage : this._message - this._myMessageLenth = isEncrypted === 1 ? this.constructor.utils.int32ToBytes(this._myMessage.length) : this._messageLength - } - - set isText(isText) { - this._isText = new Uint8Array(1); - this._isText[0] = isText; - } - - get params() { - const params = super.params; - params.push( - this._proofOfWorkNonce, - this._hasReceipient, - this._recipient, - this._myMessageLenth, - this._myMessage, - this._isEncrypted, - this._isText, - this._feeBytes - ) - console.log('updated test') - // After the feature trigger timestamp we need to include chat reference - if (new Date(this._timestamp).getTime() >= CHAT_REFERENCE_FEATURE_TRIGGER_TIMESTAMP) { - params.push(this._hasChatReference) - - if (this._hasChatReference[0] == 1) { - console.log('past through', this._chatReference) - params.push(this._chatReference) - } - } - console.log({params}) - return params; - } + if (this._hasChatReference[0] == 1) { + params.push(this._chatReference) + } + } + return params + } } diff --git a/qortal-ui-crypto/api/transactions/chat/GroupChatTransaction.js b/qortal-ui-crypto/api/transactions/chat/GroupChatTransaction.js index 4f0f2386..dc3a856b 100644 --- a/qortal-ui-crypto/api/transactions/chat/GroupChatTransaction.js +++ b/qortal-ui-crypto/api/transactions/chat/GroupChatTransaction.js @@ -1,72 +1,68 @@ -"use strict"; +'use strict' import ChatBase from "./ChatBase.js" import { CHAT_REFERENCE_FEATURE_TRIGGER_TIMESTAMP } from '../../constants.js' export default class GroupChatTransaction extends ChatBase { - constructor() { - super(); - this.type = 18 - this.fee = 0 - } + constructor() { + super(); + this.type = 18 + this.fee = 0 + } - set proofOfWorkNonce(proofOfWorkNonce) { - this._proofOfWorkNonce = this.constructor.utils.int32ToBytes(proofOfWorkNonce) - } + set proofOfWorkNonce(proofOfWorkNonce) { + this._proofOfWorkNonce = this.constructor.utils.int32ToBytes(proofOfWorkNonce) + } + set hasReceipient(hasReceipient) { + this._hasReceipient = new Uint8Array(1) + this._hasReceipient[0] = hasReceipient + } - set hasReceipient(hasReceipient) { - this._hasReceipient = new Uint8Array(1) - this._hasReceipient[0] = hasReceipient - } + set message(message) { + this.messageText = message + this._message = this.constructor.utils.stringtoUTF8Array(message) + this._messageLength = this.constructor.utils.int32ToBytes(this._message.length) + } - set hasChatReference(hasChatReference) { - this._hasChatReference = new Uint8Array(1) - this._hasChatReference[0] = hasChatReference - } + set hasChatReference(hasChatReference) { + this._hasChatReference = new Uint8Array(1) + this._hasChatReference[0] = hasChatReference + } - set chatReference(chatReference) { - this._chatReference = chatReference instanceof Uint8Array ? chatReference : this.constructor.Base58.decode(chatReference) - } + set chatReference(chatReference) { + this._chatReference = chatReference instanceof Uint8Array ? chatReference : this.constructor.Base58.decode(chatReference) + } - set message(message) { + set isEncrypted(isEncrypted) { + this._isEncrypted = new Uint8Array(1); + this._isEncrypted[0] = isEncrypted + } - this.messageText = message; + set isText(isText) { + this._isText = new Uint8Array(1) + this._isText[0] = isText + } - this._message = this.constructor.utils.stringtoUTF8Array(message) - this._messageLength = this.constructor.utils.int32ToBytes(this._message.length) - } + get params() { + const params = super.params + params.push( + this._proofOfWorkNonce, + this._hasReceipient, + this._messageLength, + this._message, + this._isEncrypted, + this._isText, + this._feeBytes + ) - set isEncrypted(isEncrypted) { - this._isEncrypted = new Uint8Array(1); - this._isEncrypted[0] = isEncrypted; // Set to false... - } + // After the feature trigger timestamp we need to include chat reference + if (new Date(this._timestamp).getTime() >= CHAT_REFERENCE_FEATURE_TRIGGER_TIMESTAMP) { + params.push(this._hasChatReference) - set isText(isText) { - this._isText = new Uint8Array(1); - this._isText[0] = isText; // Set to true - } - - get params() { - const params = super.params; - params.push( - this._proofOfWorkNonce, - this._hasReceipient, - this._messageLength, - this._message, - this._isEncrypted, - this._isText, - this._feeBytes - ) - - // After the feature trigger timestamp we need to include chat reference - if (new Date(this._timestamp).getTime() >= CHAT_REFERENCE_FEATURE_TRIGGER_TIMESTAMP) { - params.push(this._hasChatReference) - - if (this._hasChatReference[0] == 1) { - params.push(this._chatReference) - } - } - - return params; - } + if (this._hasChatReference[0] == 1) { + params.push(this._chatReference) + } + } + return params + } } diff --git a/qortal-ui-crypto/api/transactions/chat/decryptChatMessage.js b/qortal-ui-crypto/api/transactions/chat/decryptChatMessage.js index 5ea06ec8..038db155 100644 --- a/qortal-ui-crypto/api/transactions/chat/decryptChatMessage.js +++ b/qortal-ui-crypto/api/transactions/chat/decryptChatMessage.js @@ -3,25 +3,24 @@ import Base58 from '../../deps/Base58.js' import ed2curve from '../../deps/ed2curve.js' import { Sha256 } from 'asmcrypto.js' - export const decryptChatMessage = (encryptedMessage, privateKey, recipientPublicKey, lastReference) => { - let _encryptedMessage = Base58.decode(encryptedMessage) + let _encryptedMessage = Base58.decode(encryptedMessage) - const _base58RecipientPublicKey = recipientPublicKey instanceof Uint8Array ? Base58.encode(recipientPublicKey) : recipientPublicKey - const _recipientPublicKey = Base58.decode(_base58RecipientPublicKey) + const _base58RecipientPublicKey = recipientPublicKey instanceof Uint8Array ? Base58.encode(recipientPublicKey) : recipientPublicKey + const _recipientPublicKey = Base58.decode(_base58RecipientPublicKey) - const _lastReference = lastReference instanceof Uint8Array ? lastReference : Base58.decode(lastReference) + const _lastReference = lastReference instanceof Uint8Array ? lastReference : Base58.decode(lastReference) - const convertedPrivateKey = ed2curve.convertSecretKey(privateKey) - const convertedPublicKey = ed2curve.convertPublicKey(_recipientPublicKey) - const sharedSecret = new Uint8Array(32); - nacl.lowlevel.crypto_scalarmult(sharedSecret, convertedPrivateKey, convertedPublicKey); + const convertedPrivateKey = ed2curve.convertSecretKey(privateKey) + const convertedPublicKey = ed2curve.convertPublicKey(_recipientPublicKey) + const sharedSecret = new Uint8Array(32); + nacl.lowlevel.crypto_scalarmult(sharedSecret, convertedPrivateKey, convertedPublicKey) - const _chatEncryptionSeed = new Sha256().process(sharedSecret).finish().result - const _decryptedMessage = nacl.secretbox.open(_encryptedMessage, _lastReference.slice(0, 24), _chatEncryptionSeed) + const _chatEncryptionSeed = new Sha256().process(sharedSecret).finish().result + const _decryptedMessage = nacl.secretbox.open(_encryptedMessage, _lastReference.slice(0, 24), _chatEncryptionSeed) - let decryptedMessage = '' + let decryptedMessage = '' - _decryptedMessage === false ? decryptedMessage : decryptedMessage = new TextDecoder('utf-8').decode(_decryptedMessage); - return decryptedMessage + _decryptedMessage === false ? decryptedMessage : decryptedMessage = new TextDecoder('utf-8').decode(_decryptedMessage) + return decryptedMessage } diff --git a/qortal-ui-crypto/api/transactions/chat/signChat.js b/qortal-ui-crypto/api/transactions/chat/signChat.js index 2c8428da..6760dac5 100644 --- a/qortal-ui-crypto/api/transactions/chat/signChat.js +++ b/qortal-ui-crypto/api/transactions/chat/signChat.js @@ -1,46 +1,43 @@ import nacl from '../../deps/nacl-fast.js' import utils from '../../deps/utils.js' - const signChat = (chatBytes, nonce, keyPair) => { - if (!chatBytes) { - throw new Error('Chat Bytes not defined') - } + if (!chatBytes) { + throw new Error('Chat Bytes not defined') + } - if (!nonce) { - throw new Error('Nonce not defined') - } + if (!nonce) { + throw new Error('Nonce not defined') + } - if (!keyPair) { - throw new Error('keyPair not defined') - } + if (!keyPair) { + throw new Error('keyPair not defined') + } - const _nonce = utils.int32ToBytes(nonce) + const _nonce = utils.int32ToBytes(nonce) - if (chatBytes.length === undefined) { - const _chatBytesBuffer = Object.keys(chatBytes).map(function (key) { return chatBytes[key]; }); + if (chatBytes.length === undefined) { + const _chatBytesBuffer = Object.keys(chatBytes).map(function (key) { return chatBytes[key]; }) - const chatBytesBuffer = new Uint8Array(_chatBytesBuffer) - chatBytesBuffer.set(_nonce, 112) + const chatBytesBuffer = new Uint8Array(_chatBytesBuffer) + chatBytesBuffer.set(_nonce, 112) + const signature = nacl.sign.detached(chatBytesBuffer, keyPair.privateKey) - const signature = nacl.sign.detached(chatBytesBuffer, keyPair.privateKey) + const signedBytes = utils.appendBuffer(chatBytesBuffer, signature) - const signedBytes = utils.appendBuffer(chatBytesBuffer, signature) + return signedBytes + } else { + const chatBytesBuffer = new Uint8Array(chatBytes) + chatBytesBuffer.set(_nonce, 112) - return signedBytes - } else { - const chatBytesBuffer = new Uint8Array(chatBytes) - chatBytesBuffer.set(_nonce, 112) + const signature = nacl.sign.detached(chatBytesBuffer, keyPair.privateKey) + const signedBytes = utils.appendBuffer(chatBytesBuffer, signature) - const signature = nacl.sign.detached(chatBytesBuffer, keyPair.privateKey) - - const signedBytes = utils.appendBuffer(chatBytesBuffer, signature) - - return signedBytes - } + return signedBytes + } } export default signChat diff --git a/qortal-ui-crypto/api/transactions/groups/AddGroupAdminTransaction.js b/qortal-ui-crypto/api/transactions/groups/AddGroupAdminTransaction.js index b4d6c120..4f5bf090 100644 --- a/qortal-ui-crypto/api/transactions/groups/AddGroupAdminTransaction.js +++ b/qortal-ui-crypto/api/transactions/groups/AddGroupAdminTransaction.js @@ -1,53 +1,53 @@ -'use strict'; -import TransactionBase from "../TransactionBase.js" -import { QORT_DECIMALS } from "../../constants.js" +'use strict' +import TransactionBase from '../TransactionBase.js' +import { QORT_DECIMALS } from '../../constants.js' export default class AddGroupAdminTransaction extends TransactionBase { - constructor() { - super() - this.type = 24 - } + constructor() { + super() + this.type = 24 + } - render(html) { - return html` - ${this._addAdminDialog1} -
- ${this.theRecipient} -
- ${this._addAdminDialog2} - ` - } + render(html) { + return html` + ${this._addAdminDialog1} +
+ ${this.theRecipient} +
+ ${this._addAdminDialog2} + ` + } - set addAdminDialog1(addAdminDialog1) { - this._addAdminDialog1 = addAdminDialog1 - } + set addAdminDialog1(addAdminDialog1) { + this._addAdminDialog1 = addAdminDialog1 + } - set addAdminDialog2(addAdminDialog2) { - this._addAdminDialog2 = addAdminDialog2 - } + set addAdminDialog2(addAdminDialog2) { + this._addAdminDialog2 = addAdminDialog2 + } - set rGroupId(rGroupId) { - this._rGroupId = rGroupId; - this._rGroupIdBytes = this.constructor.utils.int32ToBytes(this._rGroupId) - } + set rGroupId(rGroupId) { + this._rGroupId = rGroupId + this._rGroupIdBytes = this.constructor.utils.int32ToBytes(this._rGroupId) + } - set recipient(recipient) { - this._recipient = recipient instanceof Uint8Array ? recipient : this.constructor.Base58.decode(recipient) - this.theRecipient = recipient - } + set recipient(recipient) { + this._recipient = recipient instanceof Uint8Array ? recipient : this.constructor.Base58.decode(recipient) + this.theRecipient = recipient + } - set fee(fee) { - this._fee = fee * QORT_DECIMALS - this._feeBytes = this.constructor.utils.int64ToBytes(this._fee) - } + set fee(fee) { + this._fee = fee * QORT_DECIMALS + this._feeBytes = this.constructor.utils.int64ToBytes(this._fee) + } - get params() { - const params = super.params - params.push( - this._rGroupIdBytes, - this._recipient, - this._feeBytes - ) - return params - } -} \ No newline at end of file + get params() { + const params = super.params + params.push( + this._rGroupIdBytes, + this._recipient, + this._feeBytes + ) + return params + } +} diff --git a/qortal-ui-crypto/api/transactions/groups/CancelGroupBanTransaction.js b/qortal-ui-crypto/api/transactions/groups/CancelGroupBanTransaction.js index 3e36be23..61de1e34 100644 --- a/qortal-ui-crypto/api/transactions/groups/CancelGroupBanTransaction.js +++ b/qortal-ui-crypto/api/transactions/groups/CancelGroupBanTransaction.js @@ -1,53 +1,53 @@ -'use strict'; -import TransactionBase from "../TransactionBase.js" -import { QORT_DECIMALS } from "../../constants.js" +'use strict' +import TransactionBase from '../TransactionBase.js' +import { QORT_DECIMALS } from '../../constants.js' export default class CancelGroupBanTransaction extends TransactionBase { - constructor() { - super() - this.type = 27 - } + constructor() { + super() + this.type = 27 + } - render(html) { - return html` - ${this._cancelBanMemberDialog1} -
- ${this.theRecipient} -
- ${this._cancelBanMemberDialog2} - ` - } + render(html) { + return html` + ${this._cancelBanMemberDialog1} +
+ ${this.theRecipient} +
+ ${this._cancelBanMemberDialog2} + ` + } - set cancelBanMemberDialog1(cancelBanMemberDialog1) { - this._cancelBanMemberDialog1= cancelBanMemberDialog1 - } + set cancelBanMemberDialog1(cancelBanMemberDialog1) { + this._cancelBanMemberDialog1 = cancelBanMemberDialog1 + } - set cancelBanMemberDialog2(cancelBanMemberDialog2) { - this._cancelBanMemberDialog2 = cancelBanMemberDialog2 - } + set cancelBanMemberDialog2(cancelBanMemberDialog2) { + this._cancelBanMemberDialog2 = cancelBanMemberDialog2 + } - set rGroupId(rGroupId) { - this._rGroupId = rGroupId - this._rGroupIdBytes = this.constructor.utils.int32ToBytes(this._rGroupId) - } + set rGroupId(rGroupId) { + this._rGroupId = rGroupId + this._rGroupIdBytes = this.constructor.utils.int32ToBytes(this._rGroupId) + } - set recipient(recipient) { - this._recipient = recipient instanceof Uint8Array ? recipient : this.constructor.Base58.decode(recipient) - this.theRecipient = recipient - } + set recipient(recipient) { + this._recipient = recipient instanceof Uint8Array ? recipient : this.constructor.Base58.decode(recipient) + this.theRecipient = recipient + } - set fee(fee) { - this._fee = fee * QORT_DECIMALS - this._feeBytes = this.constructor.utils.int64ToBytes(this._fee) - } + set fee(fee) { + this._fee = fee * QORT_DECIMALS + this._feeBytes = this.constructor.utils.int64ToBytes(this._fee) + } - get params() { - const params = super.params - params.push( - this._rGroupIdBytes, - this._recipient, - this._feeBytes - ) - return params - } -} \ No newline at end of file + get params() { + const params = super.params + params.push( + this._rGroupIdBytes, + this._recipient, + this._feeBytes + ) + return params + } +} diff --git a/qortal-ui-crypto/api/transactions/groups/CancelGroupInviteTransaction.js b/qortal-ui-crypto/api/transactions/groups/CancelGroupInviteTransaction.js index 79d24656..10bb800b 100644 --- a/qortal-ui-crypto/api/transactions/groups/CancelGroupInviteTransaction.js +++ b/qortal-ui-crypto/api/transactions/groups/CancelGroupInviteTransaction.js @@ -1,60 +1,60 @@ -'use strict'; -import TransactionBase from "../TransactionBase.js" -import { QORT_DECIMALS } from "../../constants.js" +'use strict' +import TransactionBase from '../TransactionBase.js' +import { QORT_DECIMALS } from '../../constants.js' export default class CancelGroupInviteTransaction extends TransactionBase { - constructor() { - super() - this.type = 30 - } + constructor() { + super() + this.type = 30 + } - render(html) { - return html` - ${this._cancelInviteDialog1} -
- ${this._memberName} -
-
- ${this.theRecipient} -
- ${this._cancelInviteDialog2} - ` - } + render(html) { + return html` + ${this._cancelInviteDialog1} +
+ ${this._memberName} +
+
+ ${this.theRecipient} +
+ ${this._cancelInviteDialog2} + ` + } - set memberName(memberName) { - this._memberName = memberName - } + set memberName(memberName) { + this._memberName = memberName + } - set cancelInviteDialog1(cancelInviteDialog1) { - this._cancelInviteDialog1 = cancelInviteDialog1 - } + set cancelInviteDialog1(cancelInviteDialog1) { + this._cancelInviteDialog1 = cancelInviteDialog1 + } - set cancelInviteDialog2(cancelInviteDialog2) { - this._cancelInviteDialog2 = cancelInviteDialog2 - } + set cancelInviteDialog2(cancelInviteDialog2) { + this._cancelInviteDialog2 = cancelInviteDialog2 + } - set rGroupId(rGroupId) { - this._rGroupId = rGroupId; - this._rGroupIdBytes = this.constructor.utils.int32ToBytes(this._rGroupId) - } + set rGroupId(rGroupId) { + this._rGroupId = rGroupId + this._rGroupIdBytes = this.constructor.utils.int32ToBytes(this._rGroupId) + } - set recipient(recipient) { - this._recipient = recipient instanceof Uint8Array ? recipient : this.constructor.Base58.decode(recipient) - this.theRecipient = recipient - } + set recipient(recipient) { + this._recipient = recipient instanceof Uint8Array ? recipient : this.constructor.Base58.decode(recipient) + this.theRecipient = recipient + } - set fee(fee) { - this._fee = fee * QORT_DECIMALS - this._feeBytes = this.constructor.utils.int64ToBytes(this._fee) - } + set fee(fee) { + this._fee = fee * QORT_DECIMALS + this._feeBytes = this.constructor.utils.int64ToBytes(this._fee) + } - get params() { - const params = super.params - params.push( - this._rGroupIdBytes, - this._recipient, - this._feeBytes - ) - return params - } -} \ No newline at end of file + get params() { + const params = super.params + params.push( + this._rGroupIdBytes, + this._recipient, + this._feeBytes + ) + return params + } +} diff --git a/qortal-ui-crypto/api/transactions/groups/CreateGroupTransaction.js b/qortal-ui-crypto/api/transactions/groups/CreateGroupTransaction.js index 909b46bd..0b76ead0 100644 --- a/qortal-ui-crypto/api/transactions/groups/CreateGroupTransaction.js +++ b/qortal-ui-crypto/api/transactions/groups/CreateGroupTransaction.js @@ -1,98 +1,98 @@ -"use strict"; -import TransactionBase from "../TransactionBase.js" -import { QORT_DECIMALS } from "../../constants.js" +'use strict' +import TransactionBase from '../TransactionBase.js' +import { QORT_DECIMALS } from '../../constants.js' export default class CreateGroupTransaction extends TransactionBase { - constructor() { - super() - this.type = 22 - } + constructor() { + super() + this.type = 22 + } - render(html) { - return html` - ${this._groupdialog5} -
-
${this._groupdialog7}: ${this._rGroupName}
-
-
${this._groupdialog8}: ${this._rGroupDesc}
-
-
${this._groupdialog9}: ${this.myGroupType === 1 ? "Public" : "Private"}
-
- ${this._groupdialog6} - ` - } + render(html) { + return html` + ${this._groupdialog5} +
+
${this._groupdialog7}: ${this._rGroupName}
+
+
${this._groupdialog8}: ${this._rGroupDesc}
+
+
${this._groupdialog9}: ${this.myGroupType === 1 ? "Public" : "Private"}
+
+ ${this._groupdialog6} + ` + } - set groupdialog5(groupdialog5) { - this._groupdialog5 = groupdialog5 - } + set groupdialog5(groupdialog5) { + this._groupdialog5 = groupdialog5 + } - set groupdialog6(groupdialog6) { - this._groupdialog6 = groupdialog6 - } + set groupdialog6(groupdialog6) { + this._groupdialog6 = groupdialog6 + } - set groupdialog7(groupdialog7) { - this._groupdialog7 = groupdialog7 - } + set groupdialog7(groupdialog7) { + this._groupdialog7 = groupdialog7 + } - set groupdialog8(groupdialog8) { - this._groupdialog8 = groupdialog8 - } + set groupdialog8(groupdialog8) { + this._groupdialog8 = groupdialog8 + } - set groupdialog9(groupdialog9) { - this._groupdialog9 = groupdialog9 - } + set groupdialog9(groupdialog9) { + this._groupdialog9 = groupdialog9 + } - set fee(fee) { - this._fee = fee * QORT_DECIMALS - this._feeBytes = this.constructor.utils.int64ToBytes(this._fee) - } + set fee(fee) { + this._fee = fee * QORT_DECIMALS + this._feeBytes = this.constructor.utils.int64ToBytes(this._fee) + } - set rGroupName(rGroupName) { - this._rGroupName = rGroupName; - this._rGroupNameBytes = this.constructor.utils.stringtoUTF8Array(this._rGroupName.toLocaleLowerCase()) - this._rGroupNameLength = this.constructor.utils.int32ToBytes(this._rGroupNameBytes.length) - } + set rGroupName(rGroupName) { + this._rGroupName = rGroupName + this._rGroupNameBytes = this.constructor.utils.stringtoUTF8Array(this._rGroupName.toLocaleLowerCase()) + this._rGroupNameLength = this.constructor.utils.int32ToBytes(this._rGroupNameBytes.length) + } - set rGroupDesc(rGroupDesc) { - this._rGroupDesc = rGroupDesc; - this._rGroupDescBytes = this.constructor.utils.stringtoUTF8Array(this._rGroupDesc.toLocaleLowerCase()) - this._rGroupDescLength = this.constructor.utils.int32ToBytes(this._rGroupDescBytes.length) - } + set rGroupDesc(rGroupDesc) { + this._rGroupDesc = rGroupDesc + this._rGroupDescBytes = this.constructor.utils.stringtoUTF8Array(this._rGroupDesc.toLocaleLowerCase()) + this._rGroupDescLength = this.constructor.utils.int32ToBytes(this._rGroupDescBytes.length) + } - set rGroupType(rGroupType) { - this.myGroupType = rGroupType; - this._rGroupType = new Uint8Array(1) - this._rGroupType[0] = rGroupType; - } + set rGroupType(rGroupType) { + this.myGroupType = rGroupType + this._rGroupType = new Uint8Array(1) + this._rGroupType[0] = rGroupType + } - set rGroupApprovalThreshold(rGroupApprovalThreshold) { - this._rGroupApprovalThreshold = new Uint8Array(1) - this._rGroupApprovalThreshold[0] = rGroupApprovalThreshold; - } + set rGroupApprovalThreshold(rGroupApprovalThreshold) { + this._rGroupApprovalThreshold = new Uint8Array(1) + this._rGroupApprovalThreshold[0] = rGroupApprovalThreshold + } - set rGroupMinimumBlockDelay(rGroupMinimumBlockDelay) { - this._rGroupMinimumBlockDelay = rGroupMinimumBlockDelay; - this._rGroupMinimumBlockDelayBytes = this.constructor.utils.int32ToBytes(this._rGroupMinimumBlockDelay) - } + set rGroupMinimumBlockDelay(rGroupMinimumBlockDelay) { + this._rGroupMinimumBlockDelay = rGroupMinimumBlockDelay + this._rGroupMinimumBlockDelayBytes = this.constructor.utils.int32ToBytes(this._rGroupMinimumBlockDelay) + } - set rGroupMaximumBlockDelay(rGroupMaximumBlockDelay) { - this._rGroupMaximumBlockDelay = rGroupMaximumBlockDelay; - this._rGroupMaximumBlockDelayBytes = this.constructor.utils.int32ToBytes(this._rGroupMaximumBlockDelay) - } + set rGroupMaximumBlockDelay(rGroupMaximumBlockDelay) { + this._rGroupMaximumBlockDelay = rGroupMaximumBlockDelay + this._rGroupMaximumBlockDelayBytes = this.constructor.utils.int32ToBytes(this._rGroupMaximumBlockDelay) + } - get params() { - const params = super.params; - params.push( - this._rGroupNameLength, - this._rGroupNameBytes, - this._rGroupDescLength, - this._rGroupDescBytes, - this._rGroupType, - this._rGroupApprovalThreshold, - this._rGroupMinimumBlockDelayBytes, - this._rGroupMaximumBlockDelayBytes, - this._feeBytes - ) - return params; - } -} \ No newline at end of file + get params() { + const params = super.params + params.push( + this._rGroupNameLength, + this._rGroupNameBytes, + this._rGroupDescLength, + this._rGroupDescBytes, + this._rGroupType, + this._rGroupApprovalThreshold, + this._rGroupMinimumBlockDelayBytes, + this._rGroupMaximumBlockDelayBytes, + this._feeBytes + ) + return params + } +} diff --git a/qortal-ui-crypto/api/transactions/groups/GroupBanTransaction.js b/qortal-ui-crypto/api/transactions/groups/GroupBanTransaction.js index 2d6e2d9c..101cb364 100644 --- a/qortal-ui-crypto/api/transactions/groups/GroupBanTransaction.js +++ b/qortal-ui-crypto/api/transactions/groups/GroupBanTransaction.js @@ -1,67 +1,67 @@ -'use strict'; -import TransactionBase from "../TransactionBase.js" -import { QORT_DECIMALS } from "../../constants.js" +'use strict' +import TransactionBase from '../TransactionBase.js' +import { QORT_DECIMALS } from '../../constants.js' export default class GroupBanTransaction extends TransactionBase { - constructor() { - super() - this.type = 26 - } + constructor() { + super() + this.type = 26 + } - render(html) { - return html` - ${this._banMemberDialog1} -
- ${this.theRecipient} -
- ${this._banMemberDialog2} - ` - } + render(html) { + return html` + ${this._banMemberDialog1} +
+ ${this.theRecipient} +
+ ${this._banMemberDialog2} + ` + } - set banMemberDialog1(banMemberDialog1) { - this._banMemberDialog1= banMemberDialog1 - } + set banMemberDialog1(banMemberDialog1) { + this._banMemberDialog1 = banMemberDialog1 + } - set banMemberDialog2(banMemberDialog2) { - this._banMemberDialog2 = banMemberDialog2 - } + set banMemberDialog2(banMemberDialog2) { + this._banMemberDialog2 = banMemberDialog2 + } - set rGroupId(rGroupId) { - this._rGroupId = rGroupId; - this._rGroupIdBytes = this.constructor.utils.int32ToBytes(this._rGroupId) - } + set rGroupId(rGroupId) { + this._rGroupId = rGroupId + this._rGroupIdBytes = this.constructor.utils.int32ToBytes(this._rGroupId) + } - set rBanReason(rBanReason) { - this._rBanReason = rBanReason - this._rBanReasonBytes = this.constructor.utils.stringtoUTF8Array(this._rBanReason.toLocaleLowerCase()) - this._rBanReasonLength = this.constructor.utils.int32ToBytes(this._rBanReasonBytes.length) - } + set rBanReason(rBanReason) { + this._rBanReason = rBanReason + this._rBanReasonBytes = this.constructor.utils.stringtoUTF8Array(this._rBanReason.toLocaleLowerCase()) + this._rBanReasonLength = this.constructor.utils.int32ToBytes(this._rBanReasonBytes.length) + } - set rBanTime(rBanTime) { - this._rBanTime = rBanTime - this._rBanTimeBytes = this.constructor.utils.int32ToBytes(this._rBanTime) - } + set rBanTime(rBanTime) { + this._rBanTime = rBanTime + this._rBanTimeBytes = this.constructor.utils.int32ToBytes(this._rBanTime) + } - set recipient(recipient) { - this._recipient = recipient instanceof Uint8Array ? recipient : this.constructor.Base58.decode(recipient) - this.theRecipient = recipient - } + set recipient(recipient) { + this._recipient = recipient instanceof Uint8Array ? recipient : this.constructor.Base58.decode(recipient) + this.theRecipient = recipient + } - set fee(fee) { - this._fee = fee * QORT_DECIMALS - this._feeBytes = this.constructor.utils.int64ToBytes(this._fee) - } + set fee(fee) { + this._fee = fee * QORT_DECIMALS + this._feeBytes = this.constructor.utils.int64ToBytes(this._fee) + } - get params() { - const params = super.params - params.push( - this._rGroupIdBytes, - this._recipient, - this._rBanReasonLength, - this._rBanReasonBytes, - this._rBanTimeBytes, - this._feeBytes - ) - return params - } -} \ No newline at end of file + get params() { + const params = super.params + params.push( + this._rGroupIdBytes, + this._recipient, + this._rBanReasonLength, + this._rBanReasonBytes, + this._rBanTimeBytes, + this._feeBytes + ) + return params + } +} diff --git a/qortal-ui-crypto/api/transactions/groups/GroupInviteTransaction.js b/qortal-ui-crypto/api/transactions/groups/GroupInviteTransaction.js index 123ab820..62a89633 100644 --- a/qortal-ui-crypto/api/transactions/groups/GroupInviteTransaction.js +++ b/qortal-ui-crypto/api/transactions/groups/GroupInviteTransaction.js @@ -1,59 +1,59 @@ -'use strict'; -import TransactionBase from "../TransactionBase.js" -import { QORT_DECIMALS } from "../../constants.js" +'use strict' +import TransactionBase from '../TransactionBase.js' +import { QORT_DECIMALS } from '../../constants.js' export default class GroupInviteTransaction extends TransactionBase { - constructor() { - super() - this.type = 29 - } + constructor() { + super() + this.type = 29 + } - render(html) { - return html` - ${this._inviteMemberDialog1} -
- ${this.theRecipient} -
- ${this._inviteMemberDialog2} - ` - } + render(html) { + return html` + ${this._inviteMemberDialog1} +
+ ${this.theRecipient} +
+ ${this._inviteMemberDialog2} + ` + } - set inviteMemberDialog1(inviteMemberDialog1) { - this._inviteMemberDialog1= inviteMemberDialog1 - } + set inviteMemberDialog1(inviteMemberDialog1) { + this._inviteMemberDialog1 = inviteMemberDialog1 + } - set inviteMemberDialog2(inviteMemberDialog2) { - this._inviteMemberDialog2 = inviteMemberDialog2 - } + set inviteMemberDialog2(inviteMemberDialog2) { + this._inviteMemberDialog2 = inviteMemberDialog2 + } - set rGroupId(rGroupId) { - this._rGroupId = rGroupId; - this._rGroupIdBytes = this.constructor.utils.int32ToBytes(this._rGroupId) - } + set rGroupId(rGroupId) { + this._rGroupId = rGroupId + this._rGroupIdBytes = this.constructor.utils.int32ToBytes(this._rGroupId) + } - set rInviteTime(rInviteTime) { - this._rInviteTime = rInviteTime - this._rInviteTimeBytes = this.constructor.utils.int32ToBytes(this._rInviteTime) - } + set rInviteTime(rInviteTime) { + this._rInviteTime = rInviteTime + this._rInviteTimeBytes = this.constructor.utils.int32ToBytes(this._rInviteTime) + } - set recipient(recipient) { - this._recipient = recipient instanceof Uint8Array ? recipient : this.constructor.Base58.decode(recipient) - this.theRecipient = recipient - } + set recipient(recipient) { + this._recipient = recipient instanceof Uint8Array ? recipient : this.constructor.Base58.decode(recipient) + this.theRecipient = recipient + } - set fee(fee) { - this._fee = fee * QORT_DECIMALS - this._feeBytes = this.constructor.utils.int64ToBytes(this._fee) - } + set fee(fee) { + this._fee = fee * QORT_DECIMALS + this._feeBytes = this.constructor.utils.int64ToBytes(this._fee) + } - get params() { - const params = super.params - params.push( - this._rGroupIdBytes, - this._recipient, - this._rInviteTimeBytes, - this._feeBytes - ) - return params - } -} \ No newline at end of file + get params() { + const params = super.params + params.push( + this._rGroupIdBytes, + this._recipient, + this._rInviteTimeBytes, + this._feeBytes + ) + return params + } +} diff --git a/qortal-ui-crypto/api/transactions/groups/GroupKickTransaction.js b/qortal-ui-crypto/api/transactions/groups/GroupKickTransaction.js index 12e6d276..4a2af2c2 100644 --- a/qortal-ui-crypto/api/transactions/groups/GroupKickTransaction.js +++ b/qortal-ui-crypto/api/transactions/groups/GroupKickTransaction.js @@ -1,61 +1,61 @@ -'use strict'; -import TransactionBase from "../TransactionBase.js" -import { QORT_DECIMALS } from "../../constants.js" +'use strict' +import TransactionBase from '../TransactionBase.js' +import { QORT_DECIMALS } from '../../constants.js' export default class GroupKickTransaction extends TransactionBase { - constructor() { - super() - this.type = 28 - } + constructor() { + super() + this.type = 28 + } - render(html) { - return html` - ${this._kickMemberDialog1} -
- ${this.theRecipient} -
- ${this._kickMemberDialog2} - ` - } + render(html) { + return html` + ${this._kickMemberDialog1} +
+ ${this.theRecipient} +
+ ${this._kickMemberDialog2} + ` + } - set kickMemberDialog1(kickMemberDialog1) { - this._kickMemberDialog1= kickMemberDialog1 - } + set kickMemberDialog1(kickMemberDialog1) { + this._kickMemberDialog1 = kickMemberDialog1 + } - set kickMemberDialog2(kickMemberDialog2) { - this._kickMemberDialog2 = kickMemberDialog2 - } + set kickMemberDialog2(kickMemberDialog2) { + this._kickMemberDialog2 = kickMemberDialog2 + } - set rGroupId(rGroupId) { - this._rGroupId = rGroupId; - this._rGroupIdBytes = this.constructor.utils.int32ToBytes(this._rGroupId) - } + set rGroupId(rGroupId) { + this._rGroupId = rGroupId + this._rGroupIdBytes = this.constructor.utils.int32ToBytes(this._rGroupId) + } - set rBanReason(rBanReason) { - this._rBanReason = rBanReason - this._rBanReasonBytes = this.constructor.utils.stringtoUTF8Array(this._rBanReason.toLocaleLowerCase()) - this._rBanReasonLength = this.constructor.utils.int32ToBytes(this._rBanReasonBytes.length) - } + set rBanReason(rBanReason) { + this._rBanReason = rBanReason + this._rBanReasonBytes = this.constructor.utils.stringtoUTF8Array(this._rBanReason.toLocaleLowerCase()) + this._rBanReasonLength = this.constructor.utils.int32ToBytes(this._rBanReasonBytes.length) + } - set recipient(recipient) { - this._recipient = recipient instanceof Uint8Array ? recipient : this.constructor.Base58.decode(recipient) - this.theRecipient = recipient - } + set recipient(recipient) { + this._recipient = recipient instanceof Uint8Array ? recipient : this.constructor.Base58.decode(recipient) + this.theRecipient = recipient + } - set fee(fee) { - this._fee = fee * QORT_DECIMALS - this._feeBytes = this.constructor.utils.int64ToBytes(this._fee) - } + set fee(fee) { + this._fee = fee * QORT_DECIMALS + this._feeBytes = this.constructor.utils.int64ToBytes(this._fee) + } - get params() { - const params = super.params - params.push( - this._rGroupIdBytes, - this._recipient, - this._rBanReasonLength, - this._rBanReasonBytes, - this._feeBytes - ) - return params - } -} \ No newline at end of file + get params() { + const params = super.params + params.push( + this._rGroupIdBytes, + this._recipient, + this._rBanReasonLength, + this._rBanReasonBytes, + this._feeBytes + ) + return params + } +} diff --git a/qortal-ui-crypto/api/transactions/groups/JoinGroupTransaction.js b/qortal-ui-crypto/api/transactions/groups/JoinGroupTransaction.js index 126730ff..57a42bb5 100644 --- a/qortal-ui-crypto/api/transactions/groups/JoinGroupTransaction.js +++ b/qortal-ui-crypto/api/transactions/groups/JoinGroupTransaction.js @@ -1,63 +1,55 @@ -"use strict"; -import TransactionBase from "../TransactionBase.js" -import { QORT_DECIMALS } from "../../constants.js" +'use strict' +import TransactionBase from '../TransactionBase.js' +import { QORT_DECIMALS } from '../../constants.js' export default class JoinGroupTransaction extends TransactionBase { - constructor() { - super() - this.type = 31 - this.tests.push( - () => { - if (!(this._registrantAddress instanceof Uint8Array && this._registrantAddress.length == 25)) { - return "Invalid Registrant " + Base58.encode(this._registrantAddress) - } - return true - } - ) - } + constructor() { + super() + this.type = 31 + } - render(html) { - return html` - ${this._groupdialog1} -
- ${this._rGroupName} -
- ${this._groupdialog2} - ` - } + render(html) { + return html` + ${this._groupdialog1} +
+ ${this._rGroupName} +
+ ${this._groupdialog2} + ` + } - set groupdialog1(groupdialog1) { - this._groupdialog1 = groupdialog1 - } + set groupdialog1(groupdialog1) { + this._groupdialog1 = groupdialog1 + } - set groupdialog2(groupdialog2) { - this._groupdialog2 = groupdialog2 - } + set groupdialog2(groupdialog2) { + this._groupdialog2 = groupdialog2 + } - set fee(fee) { - this._fee = fee * QORT_DECIMALS - this._feeBytes = this.constructor.utils.int64ToBytes(this._fee) - } + set fee(fee) { + this._fee = fee * QORT_DECIMALS + this._feeBytes = this.constructor.utils.int64ToBytes(this._fee) + } - set registrantAddress(registrantAddress) {// Always Base58 encoded. Accepts Uint8Array or Base58 string. - this._registrantAddress = registrantAddress instanceof Uint8Array ? registrantAddress : this.constructor.Base58.decode(registrantAddress); - } + set registrantAddress(registrantAddress) { + this._registrantAddress = registrantAddress instanceof Uint8Array ? registrantAddress : this.constructor.Base58.decode(registrantAddress) + } - set rGroupId(rGroupId) { - this._rGroupId = rGroupId; - this._rGroupIdBytes = this.constructor.utils.int32ToBytes(this._rGroupId) - } + set rGroupId(rGroupId) { + this._rGroupId = rGroupId + this._rGroupIdBytes = this.constructor.utils.int32ToBytes(this._rGroupId) + } - set rGroupName(rGroupName) { - this._rGroupName = rGroupName; - } + set rGroupName(rGroupName) { + this._rGroupName = rGroupName + } - get params() { - const params = super.params; - params.push( - this._rGroupIdBytes, - this._feeBytes - ) - return params; - } -} \ No newline at end of file + get params() { + const params = super.params + params.push( + this._rGroupIdBytes, + this._feeBytes + ) + return params + } +} diff --git a/qortal-ui-crypto/api/transactions/groups/LeaveGroupTransaction.js b/qortal-ui-crypto/api/transactions/groups/LeaveGroupTransaction.js index f15ce71c..988d768c 100644 --- a/qortal-ui-crypto/api/transactions/groups/LeaveGroupTransaction.js +++ b/qortal-ui-crypto/api/transactions/groups/LeaveGroupTransaction.js @@ -1,64 +1,55 @@ -"use strict"; -import TransactionBase from "../TransactionBase.js" -import { QORT_DECIMALS } from "../../constants.js" +'use strict' +import TransactionBase from '../TransactionBase.js' +import { QORT_DECIMALS } from '../../constants.js' export default class LeaveGroupTransaction extends TransactionBase { - constructor() { - super() - this.type = 32 - this.tests.push( - () => { - if (!(this._registrantAddress instanceof Uint8Array && this._registrantAddress.length == 25)) { - return "Invalid Registrant " + Base58.encode(this._registrantAddress) - } - return true - } - ) - } + constructor() { + super() + this.type = 32 + } - render(html) { - return html` - ${this._groupdialog3} -
- ${this._rGroupName} -
- ${this._groupdialog4} - ` - } + render(html) { + return html` + ${this._groupdialog3} +
+ ${this._rGroupName} +
+ ${this._groupdialog4} + ` + } - set groupdialog3(groupdialog3) { - this._groupdialog3 = groupdialog3 - } + set groupdialog3(groupdialog3) { + this._groupdialog3 = groupdialog3 + } - set groupdialog4(groupdialog4) { - this._groupdialog4 = groupdialog4 - } + set groupdialog4(groupdialog4) { + this._groupdialog4 = groupdialog4 + } - set fee(fee) { - this._fee = fee * QORT_DECIMALS - this._feeBytes = this.constructor.utils.int64ToBytes(this._fee) - } + set fee(fee) { + this._fee = fee * QORT_DECIMALS + this._feeBytes = this.constructor.utils.int64ToBytes(this._fee) + } - set registrantAddress(registrantAddress) {// Always Base58 encoded. Accepts Uint8Array or Base58 string. - this._registrantAddress = registrantAddress instanceof Uint8Array ? registrantAddress : this.constructor.Base58.decode(registrantAddress); - } + set registrantAddress(registrantAddress) { + this._registrantAddress = registrantAddress instanceof Uint8Array ? registrantAddress : this.constructor.Base58.decode(registrantAddress) + } - set rGroupId(rGroupId) { - this._rGroupId = rGroupId; - this._rGroupIdBytes = this.constructor.utils.int32ToBytes(this._rGroupId) - } + set rGroupId(rGroupId) { + this._rGroupId = rGroupId + this._rGroupIdBytes = this.constructor.utils.int32ToBytes(this._rGroupId) + } - set rGroupName(rGroupName) { - this._rGroupName = rGroupName; - } + set rGroupName(rGroupName) { + this._rGroupName = rGroupName + } - get params() { - const params = super.params; - params.push( - this._rGroupIdBytes, - this._feeBytes - ) - console.log('check exec params2', params) - return params; - } + get params() { + const params = super.params + params.push( + this._rGroupIdBytes, + this._feeBytes + ) + return params + } } diff --git a/qortal-ui-crypto/api/transactions/groups/RemoveGroupAdminTransaction.js b/qortal-ui-crypto/api/transactions/groups/RemoveGroupAdminTransaction.js index 502c6166..05af0da9 100644 --- a/qortal-ui-crypto/api/transactions/groups/RemoveGroupAdminTransaction.js +++ b/qortal-ui-crypto/api/transactions/groups/RemoveGroupAdminTransaction.js @@ -1,53 +1,53 @@ -'use strict'; -import TransactionBase from "../TransactionBase.js" -import { QORT_DECIMALS } from "../../constants.js" +'use strict' +import TransactionBase from '../TransactionBase.js' +import { QORT_DECIMALS } from '../../constants.js' export default class RemoveGroupAdminTransaction extends TransactionBase { - constructor() { - super() - this.type = 25 - } + constructor() { + super() + this.type = 25 + } - render(html) { - return html` - ${this._kickAdminDialog1} -
- ${this.theRecipient} -
- ${this._kickAdminDialog2} - ` - } + render(html) { + return html` + ${this._kickAdminDialog1} +
+ ${this.theRecipient} +
+ ${this._kickAdminDialog2} + ` + } - set kickAdminDialog1(kickAdminDialog1) { - this._kickAdminDialog1 = kickAdminDialog1 - } + set kickAdminDialog1(kickAdminDialog1) { + this._kickAdminDialog1 = kickAdminDialog1 + } - set kickAdminDialog2(kickAdminDialog2) { - this._kickAdminDialog2 = kickAdminDialog2 - } + set kickAdminDialog2(kickAdminDialog2) { + this._kickAdminDialog2 = kickAdminDialog2 + } - set rGroupId(rGroupId) { - this._rGroupId = rGroupId; - this._rGroupIdBytes = this.constructor.utils.int32ToBytes(this._rGroupId) - } + set rGroupId(rGroupId) { + this._rGroupId = rGroupId + this._rGroupIdBytes = this.constructor.utils.int32ToBytes(this._rGroupId) + } - set recipient(recipient) { - this._recipient = recipient instanceof Uint8Array ? recipient : this.constructor.Base58.decode(recipient) - this.theRecipient = recipient - } + set recipient(recipient) { + this._recipient = recipient instanceof Uint8Array ? recipient : this.constructor.Base58.decode(recipient) + this.theRecipient = recipient + } - set fee(fee) { - this._fee = fee * QORT_DECIMALS - this._feeBytes = this.constructor.utils.int64ToBytes(this._fee) - } + set fee(fee) { + this._fee = fee * QORT_DECIMALS + this._feeBytes = this.constructor.utils.int64ToBytes(this._fee) + } - get params() { - const params = super.params - params.push( - this._rGroupIdBytes, - this._recipient, - this._feeBytes - ) - return params - } -} \ No newline at end of file + get params() { + const params = super.params + params.push( + this._rGroupIdBytes, + this._recipient, + this._feeBytes + ) + return params + } +} diff --git a/qortal-ui-crypto/api/transactions/names/BuyNameTransacion.js b/qortal-ui-crypto/api/transactions/names/BuyNameTransacion.js index 36aa7d60..48671a2a 100644 --- a/qortal-ui-crypto/api/transactions/names/BuyNameTransacion.js +++ b/qortal-ui-crypto/api/transactions/names/BuyNameTransacion.js @@ -1,70 +1,70 @@ -'use strict'; +'use strict' import TransactionBase from '../TransactionBase.js' import { QORT_DECIMALS } from '../../constants.js' export default class BuyNameTransacion extends TransactionBase { - constructor() { - super() - this.type = 7 - } + constructor() { + super() + this.type = 7 + } - render(html) { - return html` - ${this._buyNameDialog1} -
- ${this.nameText} -
- ${this._buyNameDialog2} -
- ${this.showSellPrice} -
- ${this._buyNameDialog3} - ` - } + render(html) { + return html` + ${this._buyNameDialog1} +
+ ${this.nameText} +
+ ${this._buyNameDialog2} +
+ ${this.showSellPrice} +
+ ${this._buyNameDialog3} + ` + } - set buyNameDialog1(buyNameDialog1) { - this._buyNameDialog1 = buyNameDialog1 - } + set buyNameDialog1(buyNameDialog1) { + this._buyNameDialog1 = buyNameDialog1 + } - set buyNameDialog2(buyNameDialog2) { - this._buyNameDialog2 = buyNameDialog2 - } + set buyNameDialog2(buyNameDialog2) { + this._buyNameDialog2 = buyNameDialog2 + } - set buyNameDialog3(buyNameDialog3) { - this._buyNameDialog3 = buyNameDialog3 - } + set buyNameDialog3(buyNameDialog3) { + this._buyNameDialog3 = buyNameDialog3 + } - set fee(fee) { - this._fee = fee * QORT_DECIMALS - this._feeBytes = this.constructor.utils.int64ToBytes(this._fee) - } + set fee(fee) { + this._fee = fee * QORT_DECIMALS + this._feeBytes = this.constructor.utils.int64ToBytes(this._fee) + } - set name(name) { - this.nameText = name - this._nameBytes = this.constructor.utils.stringtoUTF8Array(name) - this._nameLength = this.constructor.utils.int32ToBytes(this._nameBytes.length) - } + set name(name) { + this.nameText = name + this._nameBytes = this.constructor.utils.stringtoUTF8Array(name) + this._nameLength = this.constructor.utils.int32ToBytes(this._nameBytes.length) + } - set sellPrice(sellPrice) { - this.showSellPrice = sellPrice - this._sellPrice = sellPrice * QORT_DECIMALS - this._sellPriceBytes = this.constructor.utils.int64ToBytes(this._sellPrice) - } + set sellPrice(sellPrice) { + this.showSellPrice = sellPrice + this._sellPrice = sellPrice * QORT_DECIMALS + this._sellPriceBytes = this.constructor.utils.int64ToBytes(this._sellPrice) + } - set recipient(recipient) { - this._recipient = recipient instanceof Uint8Array ? recipient : this.constructor.Base58.decode(recipient) - this.theRecipient = recipient - } + set recipient(recipient) { + this._recipient = recipient instanceof Uint8Array ? recipient : this.constructor.Base58.decode(recipient) + this.theRecipient = recipient + } - get params() { - const params = super.params - params.push( - this._nameLength, - this._nameBytes, - this._sellPriceBytes, - this._recipient, - this._feeBytes - ) - return params - } -} \ No newline at end of file + get params() { + const params = super.params + params.push( + this._nameLength, + this._nameBytes, + this._sellPriceBytes, + this._recipient, + this._feeBytes + ) + return params + } +} diff --git a/qortal-ui-crypto/api/transactions/names/CancelSellNameTransacion.js b/qortal-ui-crypto/api/transactions/names/CancelSellNameTransacion.js index bc5a69b3..da8f98bb 100644 --- a/qortal-ui-crypto/api/transactions/names/CancelSellNameTransacion.js +++ b/qortal-ui-crypto/api/transactions/names/CancelSellNameTransacion.js @@ -1,49 +1,49 @@ -'use strict'; +'use strict' import TransactionBase from '../TransactionBase.js' import { QORT_DECIMALS } from '../../constants.js' export default class CancelSellNameTransacion extends TransactionBase { - constructor() { - super() - this.type = 6 - } + constructor() { + super() + this.type = 6 + } - render(html) { - return html` - ${this._cancelSellNameDialog1} -
- ${this.nameText} -
- ${this._cancelSellNameDialog2} - ` - } + render(html) { + return html` + ${this._cancelSellNameDialog1} +
+ ${this.nameText} +
+ ${this._cancelSellNameDialog2} + ` + } - set cancelSellNameDialog1(cancelSellNameDialog1) { - this._cancelSellNameDialog1 = cancelSellNameDialog1 - } + set cancelSellNameDialog1(cancelSellNameDialog1) { + this._cancelSellNameDialog1 = cancelSellNameDialog1 + } - set cancelSellNameDialog2(cancelSellNameDialog2) { - this._cancelSellNameDialog2 = cancelSellNameDialog2 - } + set cancelSellNameDialog2(cancelSellNameDialog2) { + this._cancelSellNameDialog2 = cancelSellNameDialog2 + } - set fee(fee) { - this._fee = fee * QORT_DECIMALS - this._feeBytes = this.constructor.utils.int64ToBytes(this._fee) - } + set fee(fee) { + this._fee = fee * QORT_DECIMALS + this._feeBytes = this.constructor.utils.int64ToBytes(this._fee) + } - set name(name) { - this.nameText = name - this._nameBytes = this.constructor.utils.stringtoUTF8Array(name) - this._nameLength = this.constructor.utils.int32ToBytes(this._nameBytes.length) - } + set name(name) { + this.nameText = name + this._nameBytes = this.constructor.utils.stringtoUTF8Array(name) + this._nameLength = this.constructor.utils.int32ToBytes(this._nameBytes.length) + } - get params() { - const params = super.params - params.push( - this._nameLength, - this._nameBytes, - this._feeBytes - ) - return params - } -} \ No newline at end of file + get params() { + const params = super.params + params.push( + this._nameLength, + this._nameBytes, + this._feeBytes + ) + return params + } +} diff --git a/qortal-ui-crypto/api/transactions/names/RegisterNameTransaction.js b/qortal-ui-crypto/api/transactions/names/RegisterNameTransaction.js index dac9f69e..6076e7c3 100644 --- a/qortal-ui-crypto/api/transactions/names/RegisterNameTransaction.js +++ b/qortal-ui-crypto/api/transactions/names/RegisterNameTransaction.js @@ -1,57 +1,57 @@ -"use strict"; -import TransactionBase from "../TransactionBase.js" -import { QORT_DECIMALS } from "../../constants.js" +'use strict' +import TransactionBase from '../TransactionBase.js' +import { QORT_DECIMALS } from '../../constants.js' export default class RegisterNameTransaction extends TransactionBase { - constructor() { - super() - this.type = 3 - } + constructor() { + super() + this.type = 3 + } - render(html) { - return html` - ${this._dialogyou} -
- ${this.nameText} -
- ${this._dialogonpress} - ` - } + render(html) { + return html` + ${this._dialogyou} +
+ ${this.nameText} +
+ ${this._dialogonpress} + ` + } - set dialogyou(dialogyou) { - this._dialogyou = dialogyou - } + set dialogyou(dialogyou) { + this._dialogyou = dialogyou + } - set dialogonpress(dialogonpress) { - this._dialogonpress = dialogonpress - } + set dialogonpress(dialogonpress) { + this._dialogonpress = dialogonpress + } - set fee(fee) { - this._fee = fee * QORT_DECIMALS - this._feeBytes = this.constructor.utils.int64ToBytes(this._fee) - } + set fee(fee) { + this._fee = fee * QORT_DECIMALS + this._feeBytes = this.constructor.utils.int64ToBytes(this._fee) + } - set name(name) { - this.nameText = name; - this._nameBytes = this.constructor.utils.stringtoUTF8Array(name) - this._nameLength = this.constructor.utils.int32ToBytes(this._nameBytes.length) - } + set name(name) { + this.nameText = name + this._nameBytes = this.constructor.utils.stringtoUTF8Array(name) + this._nameLength = this.constructor.utils.int32ToBytes(this._nameBytes.length) + } - set value(value) { - this.valueText = value.length === 0 ? "Registered Name on the Qortal Chain" : value; - this._valueBytes = this.constructor.utils.stringtoUTF8Array(this.valueText) - this._valueLength = this.constructor.utils.int32ToBytes(this._valueBytes.length) - } + set value(value) { + this.valueText = value.length === 0 ? "Registered Name on the Qortal Chain" : value + this._valueBytes = this.constructor.utils.stringtoUTF8Array(this.valueText) + this._valueLength = this.constructor.utils.int32ToBytes(this._valueBytes.length) + } - get params() { - const params = super.params; - params.push( - this._nameLength, - this._nameBytes, - this._valueLength, - this._valueBytes, - this._feeBytes - ) - return params; - } + get params() { + const params = super.params + params.push( + this._nameLength, + this._nameBytes, + this._valueLength, + this._valueBytes, + this._feeBytes + ) + return params + } } diff --git a/qortal-ui-crypto/api/transactions/names/SellNameTransacion.js b/qortal-ui-crypto/api/transactions/names/SellNameTransacion.js index aeb8b72e..8659edf7 100644 --- a/qortal-ui-crypto/api/transactions/names/SellNameTransacion.js +++ b/qortal-ui-crypto/api/transactions/names/SellNameTransacion.js @@ -1,64 +1,64 @@ -'use strict'; +'use strict' import TransactionBase from '../TransactionBase.js' import { QORT_DECIMALS } from '../../constants.js' export default class SellNameTransacion extends TransactionBase { - constructor() { - super() - this.type = 5 - } + constructor() { + super() + this.type = 5 + } - render(html) { - return html` - ${this._sellNameDialog1} -
- ${this.nameText} -
- ${this._sellNameDialog2} -
- ${this.showSellPrice} -
- ${this._sellNameDialog3} - ` - } + render(html) { + return html` + ${this._sellNameDialog1} +
+ ${this.nameText} +
+ ${this._sellNameDialog2} +
+ ${this.showSellPrice} +
+ ${this._sellNameDialog3} + ` + } - set sellNameDialog1(sellNameDialog1) { - this._sellNameDialog1 = sellNameDialog1 - } + set sellNameDialog1(sellNameDialog1) { + this._sellNameDialog1 = sellNameDialog1 + } - set sellNameDialog2(sellNameDialog2) { - this._sellNameDialog2 = sellNameDialog2 - } + set sellNameDialog2(sellNameDialog2) { + this._sellNameDialog2 = sellNameDialog2 + } - set sellNameDialog3(sellNameDialog3) { - this._sellNameDialog3 = sellNameDialog3 - } + set sellNameDialog3(sellNameDialog3) { + this._sellNameDialog3 = sellNameDialog3 + } - set fee(fee) { - this._fee = fee * QORT_DECIMALS - this._feeBytes = this.constructor.utils.int64ToBytes(this._fee) - } + set fee(fee) { + this._fee = fee * QORT_DECIMALS + this._feeBytes = this.constructor.utils.int64ToBytes(this._fee) + } - set name(name) { - this.nameText = name - this._nameBytes = this.constructor.utils.stringtoUTF8Array(name) - this._nameLength = this.constructor.utils.int32ToBytes(this._nameBytes.length) - } + set name(name) { + this.nameText = name + this._nameBytes = this.constructor.utils.stringtoUTF8Array(name) + this._nameLength = this.constructor.utils.int32ToBytes(this._nameBytes.length) + } - set sellPrice(sellPrice) { - this.showSellPrice = sellPrice - this._sellPrice = sellPrice * QORT_DECIMALS - this._sellPriceBytes = this.constructor.utils.int64ToBytes(this._sellPrice) - } + set sellPrice(sellPrice) { + this.showSellPrice = sellPrice + this._sellPrice = sellPrice * QORT_DECIMALS + this._sellPriceBytes = this.constructor.utils.int64ToBytes(this._sellPrice) + } - get params() { - const params = super.params - params.push( - this._nameLength, - this._nameBytes, - this._sellPriceBytes, - this._feeBytes - ) - return params - } -} \ No newline at end of file + get params() { + const params = super.params + params.push( + this._nameLength, + this._nameBytes, + this._sellPriceBytes, + this._feeBytes + ) + return params + } +} diff --git a/qortal-ui-crypto/api/transactions/registerName_dnsthing.js b/qortal-ui-crypto/api/transactions/registerName_dnsthing.js index 08e7713c..06210cc4 100644 --- a/qortal-ui-crypto/api/transactions/registerName_dnsthing.js +++ b/qortal-ui-crypto/api/transactions/registerName_dnsthing.js @@ -1,39 +1,36 @@ -"use strict"; -/* - TO DO -*/ -(function(){ - function generateSignatureRegisterNameTransaction(keyPair, lastReference, owner, name, value, fee, timestamp) => { - const data = generateRegisterNameTransactionBase(keyPair.publicKey, lastReference, owner, name, value, fee, timestamp); - return nacl.sign.detached(data, keyPair.privateKey); - } +'use strict' - function generateRegisterNameTransaction(keyPair, lastReference, owner, name, value, fee, timestamp, signature) => { - return appendBuffer( generateRegisterNameTransactionBase(keyPair.publicKey, lastReference, owner, name, value, fee, timestamp), - signature ); - } + (function () { + function generateSignatureRegisterNameTransaction(keyPair, lastReference, owner, name, value, fee, timestamp) => { + const data = generateRegisterNameTransactionBase(keyPair.publicKey, lastReference, owner, name, value, fee, timestamp) + return nacl.sign.detached(data, keyPair.privateKey) + } - function generateRegisterNameTransactionBase(publicKey, lastReference, owner, name, value, fee, timestamp) => { - const txType = TYPES.REGISTER_NAME_TRANSACTION; - const typeBytes = int32ToBytes(txType); - const timestampBytes = int64ToBytes(timestamp); - const feeBytes = int64ToBytes(fee * 100000000); - const nameSizeBytes = int32ToBytes(name.length); - const valueSizeBytes = int32ToBytes(value.length); + function generateRegisterNameTransaction(keyPair, lastReference, owner, name, value, fee, timestamp, signature) => { + return appendBuffer(generateRegisterNameTransactionBase(keyPair.publicKey, lastReference, owner, name, value, fee, timestamp), signature) + } - let data = new Uint8Array(); + function generateRegisterNameTransactionBase(publicKey, lastReference, owner, name, value, fee, timestamp) => { + const txType = TYPES.REGISTER_NAME_TRANSACTION + const typeBytes = int32ToBytes(txType) + const timestampBytes = int64ToBytes(timestamp) + const feeBytes = int64ToBytes(fee * 100000000) + const nameSizeBytes = int32ToBytes(name.length) + const valueSizeBytes = int32ToBytes(value.length) - data = appendBuffer(data, typeBytes); - data = appendBuffer(data, timestampBytes); - data = appendBuffer(data, lastReference); - data = appendBuffer(data, publicKey); - data = appendBuffer(data, owner); - data = appendBuffer(data, nameSizeBytes); - data = appendBuffer(data, name); - data = appendBuffer(data, valueSizeBytes); - data = appendBuffer(data, value); - data = appendBuffer(data, feeBytes); + let data = new Uint8Array() - return data; - } -}()) \ No newline at end of file + data = appendBuffer(data, typeBytes) + data = appendBuffer(data, timestampBytes) + data = appendBuffer(data, lastReference) + data = appendBuffer(data, publicKey) + data = appendBuffer(data, owner) + data = appendBuffer(data, nameSizeBytes) + data = appendBuffer(data, name) + data = appendBuffer(data, valueSizeBytes) + data = appendBuffer(data, value) + data = appendBuffer(data, feeBytes) + + return data + } + }()) diff --git a/qortal-ui-crypto/api/transactions/reward-share/RemoveRewardShareTransaction.js b/qortal-ui-crypto/api/transactions/reward-share/RemoveRewardShareTransaction.js index d8ca9480..5610830e 100644 --- a/qortal-ui-crypto/api/transactions/reward-share/RemoveRewardShareTransaction.js +++ b/qortal-ui-crypto/api/transactions/reward-share/RemoveRewardShareTransaction.js @@ -1,55 +1,55 @@ -"use strict"; -import TransactionBase from "../TransactionBase.js" +'use strict' +import TransactionBase from '../TransactionBase.js' import publicKeyToAddress from '../../wallet/publicKeyToAddress.js' -import { Base58 } from "../../deps/deps.js"; +import { Base58 } from '../../deps/deps.js' export default class RemoveRewardShareTransaction extends TransactionBase { - constructor() { - super() - this.type = 38 - } + constructor() { + super() + this.type = 38 + } - render(html) { - return html` - ${this._rewarddialog5} -
- ${this.constructor.Base58.encode(this._recipient)} -
- ${this._rewarddialog6} - ` - } + render(html) { + return html` + ${this._rewarddialog5} +
+ ${this.constructor.Base58.encode(this._recipient)} +
+ ${this._rewarddialog6} + ` + } - set rewarddialog5(rewarddialog5) { - this._rewarddialog5 = rewarddialog5; - } + set rewarddialog5(rewarddialog5) { + this._rewarddialog5 = rewarddialog5 + } - set rewarddialog6(rewarddialog6) { - this._rewarddialog6 = rewarddialog6; - } + set rewarddialog6(rewarddialog6) { + this._rewarddialog6 = rewarddialog6 + } - set rewardShareKeyPairPublicKey(rewardShareKeyPairPublicKey) { - this._rewardShareKeyPairPublicKey = Base58.decode(rewardShareKeyPairPublicKey) - } + set rewardShareKeyPairPublicKey(rewardShareKeyPairPublicKey) { + this._rewardShareKeyPairPublicKey = Base58.decode(rewardShareKeyPairPublicKey) + } - set recipient(recipient) { - const _address = publicKeyToAddress(this._keyPair.publicKey) - this._recipient = recipient instanceof Uint8Array ? recipient : this.constructor.Base58.decode(recipient) - this.fee = _address === recipient ? 0 : 0.001 - } + set recipient(recipient) { + const _address = publicKeyToAddress(this._keyPair.publicKey) + this._recipient = recipient instanceof Uint8Array ? recipient : this.constructor.Base58.decode(recipient) + this.fee = _address === recipient ? 0 : 0.001 + } - set percentageShare(share) { - this._percentageShare = share * 100 - this._percentageShareBytes = this.constructor.utils.int64ToBytes(this._percentageShare) - } + set percentageShare(share) { + this._percentageShare = share * 100 + this._percentageShareBytes = this.constructor.utils.int64ToBytes(this._percentageShare) + } - get params() { - const params = super.params - params.push( - this._recipient, - this._rewardShareKeyPairPublicKey, - this._percentageShareBytes, - this._feeBytes - ) - return params; - } + get params() { + const params = super.params + params.push( + this._recipient, + this._rewardShareKeyPairPublicKey, + this._percentageShareBytes, + this._feeBytes + ) + return params + } } diff --git a/qortal-ui-crypto/api/transactions/reward-share/RewardShareTransaction.js b/qortal-ui-crypto/api/transactions/reward-share/RewardShareTransaction.js index cc67356a..939552f9 100644 --- a/qortal-ui-crypto/api/transactions/reward-share/RewardShareTransaction.js +++ b/qortal-ui-crypto/api/transactions/reward-share/RewardShareTransaction.js @@ -1,4 +1,4 @@ -"use strict"; +'use strict' import publicKeyToAddress from '../../wallet/publicKeyToAddress.js' import TransactionBase from "../TransactionBase.js" import nacl from '../../deps/nacl-fast.js' @@ -6,74 +6,73 @@ import ed2curve from '../../deps/ed2curve.js' import { Sha256 } from 'asmcrypto.js' export default class RewardShareTransaction extends TransactionBase { - constructor() { - super() - this.type = 38 - } + constructor() { + super() + this.type = 38 + } - render(html) { - return html` - ${this._rewarddialog1} ${this._percentageShare / 1e8}% ${this._rewarddialog2} ${this.constructor.Base58.encode(this._recipient)}? - ${this._rewarddialog3} -
- ${this._base58RewardShareSeed} -
- ${this._rewarddialog4} - ` - } + render(html) { + return html` + ${this._rewarddialog1} ${this._percentageShare / 1e8}% ${this._rewarddialog2} ${this.constructor.Base58.encode(this._recipient)}? + ${this._rewarddialog3} +
+ ${this._base58RewardShareSeed} +
+ ${this._rewarddialog4} + ` + } - set rewarddialog1(rewarddialog1) { - this._rewarddialog1 = rewarddialog1; - } + set rewarddialog1(rewarddialog1) { + this._rewarddialog1 = rewarddialog1 + } - set rewarddialog2(rewarddialog2) { - this._rewarddialog2 = rewarddialog2; - } + set rewarddialog2(rewarddialog2) { + this._rewarddialog2 = rewarddialog2 + } - set rewarddialog3(rewarddialog3) { - this._rewarddialog3 = rewarddialog3; - } + set rewarddialog3(rewarddialog3) { + this._rewarddialog3 = rewarddialog3 + } - set rewarddialog4(rewarddialog4) { - this._rewarddialog4 = rewarddialog4; - } + set rewarddialog4(rewarddialog4) { + this._rewarddialog4 = rewarddialog4 + } - set recipientPublicKey(recipientPublicKey) { - this._base58RecipientPublicKey = recipientPublicKey instanceof Uint8Array ? this.constructor.Base58.encode(recipientPublicKey) : recipientPublicKey - this._recipientPublicKey = this.constructor.Base58.decode(this._base58RecipientPublicKey) + set recipientPublicKey(recipientPublicKey) { + this._base58RecipientPublicKey = recipientPublicKey instanceof Uint8Array ? this.constructor.Base58.encode(recipientPublicKey) : recipientPublicKey + this._recipientPublicKey = this.constructor.Base58.decode(this._base58RecipientPublicKey) - this.recipient = publicKeyToAddress(this._recipientPublicKey) + this.recipient = publicKeyToAddress(this._recipientPublicKey) - this.fee = (recipientPublicKey === this.constructor.Base58.encode(this._keyPair.publicKey) ? 0 : 0.001) + this.fee = (recipientPublicKey === this.constructor.Base58.encode(this._keyPair.publicKey) ? 0 : 0.001) - // Reward share keys - const convertedPrivateKey = ed2curve.convertSecretKey(this._keyPair.privateKey) - const convertedPublicKey = ed2curve.convertPublicKey(this._recipientPublicKey) - const sharedSecret = new Uint8Array(32); - nacl.lowlevel.crypto_scalarmult(sharedSecret, convertedPrivateKey, convertedPublicKey); - this._rewardShareSeed = new Sha256().process(sharedSecret).finish().result - this._base58RewardShareSeed = this.constructor.Base58.encode(this._rewardShareSeed) + const convertedPrivateKey = ed2curve.convertSecretKey(this._keyPair.privateKey) + const convertedPublicKey = ed2curve.convertPublicKey(this._recipientPublicKey) + const sharedSecret = new Uint8Array(32); + nacl.lowlevel.crypto_scalarmult(sharedSecret, convertedPrivateKey, convertedPublicKey); + this._rewardShareSeed = new Sha256().process(sharedSecret).finish().result + this._base58RewardShareSeed = this.constructor.Base58.encode(this._rewardShareSeed) - this._rewardShareKeyPair = nacl.sign.keyPair.fromSeed(this._rewardShareSeed) - } + this._rewardShareKeyPair = nacl.sign.keyPair.fromSeed(this._rewardShareSeed) + } - set recipient(recipient) { // Always Base58 encoded. Accepts Uint8Array or Base58 string. - this._recipient = recipient instanceof Uint8Array ? recipient : this.constructor.Base58.decode(recipient) - } + set recipient(recipient) { + this._recipient = recipient instanceof Uint8Array ? recipient : this.constructor.Base58.decode(recipient) + } - set percentageShare(share) { - this._percentageShare = share * 100 - this._percentageShareBytes = this.constructor.utils.int64ToBytes(this._percentageShare) - } + set percentageShare(share) { + this._percentageShare = share * 100 + this._percentageShareBytes = this.constructor.utils.int64ToBytes(this._percentageShare) + } - get params() { - const params = super.params - params.push( - this._recipient, - this._rewardShareKeyPair.publicKey, - this._percentageShareBytes, - this._feeBytes - ) - return params; - } + get params() { + const params = super.params + params.push( + this._recipient, + this._rewardShareKeyPair.publicKey, + this._percentageShareBytes, + this._feeBytes + ) + return params + } } diff --git a/qortal-ui-crypto/api/transactions/trade-portal/tradebot/TradeBotCreateRequest.js b/qortal-ui-crypto/api/transactions/trade-portal/tradebot/TradeBotCreateRequest.js index 85d5867c..05178976 100644 --- a/qortal-ui-crypto/api/transactions/trade-portal/tradebot/TradeBotCreateRequest.js +++ b/qortal-ui-crypto/api/transactions/trade-portal/tradebot/TradeBotCreateRequest.js @@ -5,75 +5,59 @@ */ export default class TradeBotCreateRequest { - constructor() { - // ... - } + constructor() { + // ... + } - createTransaction(txnReq) { + createTransaction(txnReq) { + this.creatorPublicKey(txnReq.creatorPublicKey) + this.qortAmount(txnReq.qortAmount) + this.fundingQortAmount(txnReq.fundingQortAmount) + this.foreignBlockchain(txnReq.foreignBlockchain) + this.foreignAmount(txnReq.foreignAmount) + this.tradeTimeout(txnReq.tradeTimeout) + this.receivingAddress(txnReq.receivingAddress) - this.creatorPublicKey(txnReq.creatorPublicKey); + return this.txnRequest() + } - this.qortAmount(txnReq.qortAmount); + creatorPublicKey(creatorPublicKey) { + this._creatorPublicKey = creatorPublicKey + } - this.fundingQortAmount(txnReq.fundingQortAmount); + qortAmount(qortAmount) { + this._qortAmount = qortAmount + } - this.foreignBlockchain(txnReq.foreignBlockchain); + fundingQortAmount(fundingQortAmount) { + this._fundingQortAmount = fundingQortAmount + } - this.foreignAmount(txnReq.foreignAmount); + foreignBlockchain(foreignBlockchain) { + this._foreignBlockchain = foreignBlockchain + } - this.tradeTimeout(txnReq.tradeTimeout); + foreignAmount(foreignAmount) { + this._foreignAmount = foreignAmount + } - this.receivingAddress(txnReq.receivingAddress); + tradeTimeout(tradeTimeout) { + this._tradeTimeout = tradeTimeout + } - return this.txnRequest(); - } + receivingAddress(receivingAddress) { + this._receivingAddress = receivingAddress + } - creatorPublicKey(creatorPublicKey) { - - this._creatorPublicKey = creatorPublicKey; - - } - - qortAmount(qortAmount) { - this._qortAmount = qortAmount; - } - - - fundingQortAmount(fundingQortAmount) { - - this._fundingQortAmount = fundingQortAmount; - } - - foreignBlockchain(foreignBlockchain) { - - this._foreignBlockchain = foreignBlockchain; - } - - foreignAmount(foreignAmount) { - - this._foreignAmount = foreignAmount; - } - - tradeTimeout(tradeTimeout) { - - this._tradeTimeout = tradeTimeout; - } - - receivingAddress(receivingAddress) { - - this._receivingAddress = receivingAddress; - } - - txnRequest() { - - return { - creatorPublicKey: this._creatorPublicKey, - qortAmount: this._qortAmount, - fundingQortAmount: this._fundingQortAmount, - foreignBlockchain: this._foreignBlockchain, - foreignAmount: this._foreignAmount, - tradeTimeout: this._tradeTimeout, - receivingAddress: this._receivingAddress - } - } + txnRequest() { + return { + creatorPublicKey: this._creatorPublicKey, + qortAmount: this._qortAmount, + fundingQortAmount: this._fundingQortAmount, + foreignBlockchain: this._foreignBlockchain, + foreignAmount: this._foreignAmount, + tradeTimeout: this._tradeTimeout, + receivingAddress: this._receivingAddress + } + } } diff --git a/qortal-ui-crypto/api/transactions/trade-portal/tradebot/TradeBotRespondRequest.js b/qortal-ui-crypto/api/transactions/trade-portal/tradebot/TradeBotRespondRequest.js index 773ea336..4380b46b 100644 --- a/qortal-ui-crypto/api/transactions/trade-portal/tradebot/TradeBotRespondRequest.js +++ b/qortal-ui-crypto/api/transactions/trade-portal/tradebot/TradeBotRespondRequest.js @@ -5,41 +5,35 @@ */ export default class TradeBotRespondRequest { - constructor() { - // ... - } + constructor() { + // ... + } - createTransaction(txnReq) { + createTransaction(txnReq) { + this.atAddress(txnReq.atAddress) + this.foreignKey(txnReq.foreignKey) + this.receivingAddress(txnReq.receivingAddress) - this.atAddress(txnReq.atAddress) + return this.txnRequest() + } - this.foreignKey(txnReq.foreignKey) + atAddress(atAddress) { + this._atAddress = atAddress + } - this.receivingAddress(txnReq.receivingAddress) + foreignKey(foreignKey) { + this._foreignKey = foreignKey + } - return this.txnRequest() - } + receivingAddress(receivingAddress) { + this._receivingAddress = receivingAddress + } - atAddress(atAddress) { - - this._atAddress = atAddress - } - - foreignKey(foreignKey) { - this._foreignKey = foreignKey - } - - receivingAddress(receivingAddress) { - - this._receivingAddress = receivingAddress - } - - txnRequest() { - - return { - atAddress: this._atAddress, - foreignKey: this._foreignKey, - receivingAddress: this._receivingAddress - } - } + txnRequest() { + return { + atAddress: this._atAddress, + foreignKey: this._foreignKey, + receivingAddress: this._receivingAddress + } + } } diff --git a/qortal-ui-crypto/api/transactions/trade-portal/tradebot/signTradeBotTransaction.js b/qortal-ui-crypto/api/transactions/trade-portal/tradebot/signTradeBotTransaction.js index 3671183a..bce40ed8 100644 --- a/qortal-ui-crypto/api/transactions/trade-portal/tradebot/signTradeBotTransaction.js +++ b/qortal-ui-crypto/api/transactions/trade-portal/tradebot/signTradeBotTransaction.js @@ -2,37 +2,30 @@ import Base58 from '../../../deps/Base58.js' import nacl from '../../../deps/nacl-fast.js' import utils from '../../../deps/utils.js' - const signTradeBotTransaction = (unsignedTxn, keyPair) => { + if (!unsignedTxn) { + throw new Error('Unsigned Transaction Bytes not defined') + } - if (!unsignedTxn) { - throw new Error('Unsigned Transaction Bytes not defined') - } + if (!keyPair) { + throw new Error('keyPair not defined') + } - if (!keyPair) { - throw new Error('keyPair not defined') - } + const txnBuffer = Base58.decode(unsignedTxn) - const txnBuffer = Base58.decode(unsignedTxn) + if (keyPair.privateKey.length === undefined) { + const _privateKey = Object.keys(keyPair.privateKey).map(function (key) { return keyPair.privateKey[key]; }) + const privateKey = new Uint8Array(_privateKey) + const signature = nacl.sign.detached(txnBuffer, privateKey) + const signedBytes = utils.appendBuffer(txnBuffer, signature) - if (keyPair.privateKey.length === undefined) { + return signedBytes + } else { + const signature = nacl.sign.detached(txnBuffer, keyPair.privateKey) + const signedBytes = utils.appendBuffer(txnBuffer, signature) - const _privateKey = Object.keys(keyPair.privateKey).map(function (key) { return keyPair.privateKey[key]; }); - const privateKey = new Uint8Array(_privateKey) - - const signature = nacl.sign.detached(txnBuffer, privateKey) - - const signedBytes = utils.appendBuffer(txnBuffer, signature) - - return signedBytes - } else { - - const signature = nacl.sign.detached(txnBuffer, keyPair.privateKey) - - const signedBytes = utils.appendBuffer(txnBuffer, signature) - - return signedBytes - } + return signedBytes + } } export default signTradeBotTransaction diff --git a/qortal-ui-crypto/api/transactions/trade-portal/tradeoffer/DeleteTradeOffer.js b/qortal-ui-crypto/api/transactions/trade-portal/tradeoffer/DeleteTradeOffer.js index c7b3f0e1..982d2423 100644 --- a/qortal-ui-crypto/api/transactions/trade-portal/tradeoffer/DeleteTradeOffer.js +++ b/qortal-ui-crypto/api/transactions/trade-portal/tradeoffer/DeleteTradeOffer.js @@ -5,35 +5,29 @@ */ export default class DeleteTradeOffer { - constructor() { - // ... - } + constructor() { + // ... + } - createTransaction(txnReq) { + createTransaction(txnReq) { + this.creatorPublicKey(txnReq.creatorPublicKey) + this.atAddress(txnReq.atAddress) - this.creatorPublicKey(txnReq.creatorPublicKey) + return this.txnRequest() + } - this.atAddress(txnReq.atAddress) + creatorPublicKey(creatorPublicKey) { + this._creatorPublicKey = creatorPublicKey + } - return this.txnRequest() - } + atAddress(atAddress) { + this._atAddress = atAddress + } - creatorPublicKey(creatorPublicKey) { - - this._creatorPublicKey = creatorPublicKey - - } - - atAddress(atAddress) { - - this._atAddress = atAddress - } - - txnRequest() { - - return { - creatorPublicKey: this._creatorPublicKey, - atAddress: this._atAddress - } - } + txnRequest() { + return { + creatorPublicKey: this._creatorPublicKey, + atAddress: this._atAddress + } + } } diff --git a/qortal-ui-crypto/api/transactions/trade-portal/tradeoffer/cancelAllOffers.js b/qortal-ui-crypto/api/transactions/trade-portal/tradeoffer/cancelAllOffers.js index 425c2684..e3011a59 100644 --- a/qortal-ui-crypto/api/transactions/trade-portal/tradeoffer/cancelAllOffers.js +++ b/qortal-ui-crypto/api/transactions/trade-portal/tradeoffer/cancelAllOffers.js @@ -1,24 +1,25 @@ import { request } from '../../../fetch-request.js' -import { deleteTradeOffer, signTradeBotTxn } from '../../../tradeRequest.js'; +import { deleteTradeOffer, signTradeBotTxn } from '../../../tradeRequest.js' import { processTransaction } from '../../../createTransaction.js' export const cancelAllOffers = async (requestObject) => { - const keyPair = requestObject.keyPair; - const publicKey = requestObject.base58PublicKey; - const address = requestObject.address; + const keyPair = requestObject.keyPair + const publicKey = requestObject.base58PublicKey + const address = requestObject.address - const getMyOpenOffers = async () => { - const res = await request('/crosschain/tradeoffers'); - const myOpenTradeOrders = await res.filter(order => order.mode === "OFFERING" && order.qortalCreator === address); - return myOpenTradeOrders; - } + const getMyOpenOffers = async () => { + const res = await request('/crosschain/tradeoffers') + const myOpenTradeOrders = await res.filter(order => order.mode === "OFFERING" && order.qortalCreator === address) + return myOpenTradeOrders + } - const myOpenOffers = await getMyOpenOffers(); - let response = true; - myOpenOffers.forEach( async (openOffer) => { - let unsignedTxn = await deleteTradeOffer({ creatorPublicKey: publicKey, atAddress: openOffer.qortalAtAddress }); - let signedTxnBytes = await signTradeBotTxn(unsignedTxn, keyPair); - await processTransaction(signedTxnBytes); - }); - return response + const myOpenOffers = await getMyOpenOffers() + let response = true + + myOpenOffers.forEach(async (openOffer) => { + let unsignedTxn = await deleteTradeOffer({ creatorPublicKey: publicKey, atAddress: openOffer.qortalAtAddress }) + let signedTxnBytes = await signTradeBotTxn(unsignedTxn, keyPair) + await processTransaction(signedTxnBytes) + }) + return response } diff --git a/qortal-ui-crypto/api/transactions/transactions.js b/qortal-ui-crypto/api/transactions/transactions.js index ff4542ad..16b7b09b 100644 --- a/qortal-ui-crypto/api/transactions/transactions.js +++ b/qortal-ui-crypto/api/transactions/transactions.js @@ -23,26 +23,26 @@ import RemoveRewardShareTransaction from './reward-share/RemoveRewardShareTransa import TransferPrivsTransaction from './TransferPrivsTransaction.js' export const transactionTypes = { - 2: PaymentTransaction, - 3: RegisterNameTransaction, - 5: SellNameTransacion, - 6: CancelSellNameTransacion, - 7: BuyNameTransacion, - 17: MessageTransaction, - 18: ChatTransaction, - 181: GroupChatTransaction, - 19: PublicizeTransaction, - 22: CreateGroupTransaction, - 24: AddGroupAdminTransaction, - 25: RemoveGroupAdminTransaction, - 26: GroupBanTransaction, - 27: CancelGroupBanTransaction, - 28: GroupKickTransaction, - 29: GroupInviteTransaction, - 30: CancelGroupInviteTransaction, - 31: JoinGroupTransaction, - 32: LeaveGroupTransaction, - 38: RewardShareTransaction, - 381: RemoveRewardShareTransaction, - 40: TransferPrivsTransaction + 2: PaymentTransaction, + 3: RegisterNameTransaction, + 5: SellNameTransacion, + 6: CancelSellNameTransacion, + 7: BuyNameTransacion, + 17: MessageTransaction, + 18: ChatTransaction, + 181: GroupChatTransaction, + 19: PublicizeTransaction, + 22: CreateGroupTransaction, + 24: AddGroupAdminTransaction, + 25: RemoveGroupAdminTransaction, + 26: GroupBanTransaction, + 27: CancelGroupBanTransaction, + 28: GroupKickTransaction, + 29: GroupInviteTransaction, + 30: CancelGroupInviteTransaction, + 31: JoinGroupTransaction, + 32: LeaveGroupTransaction, + 38: RewardShareTransaction, + 381: RemoveRewardShareTransaction, + 40: TransferPrivsTransaction } diff --git a/qortal-ui-crypto/api/wallet/base58PublicKeyToAddress.js b/qortal-ui-crypto/api/wallet/base58PublicKeyToAddress.js index 914a67e0..dbbae27d 100644 --- a/qortal-ui-crypto/api/wallet/base58PublicKeyToAddress.js +++ b/qortal-ui-crypto/api/wallet/base58PublicKeyToAddress.js @@ -1,11 +1,8 @@ import publicKeyToAddress from './publicKeyToAddress' import Base58 from '../deps/Base58.js' - export const base58PublicKeyToAddress = (base58pubkey, qora = false) => { - const decodePubKey = Base58.decode(base58pubkey) - - const address = publicKeyToAddress(decodePubKey, qora) - - return address + const decodePubKey = Base58.decode(base58pubkey) + const address = publicKeyToAddress(decodePubKey, qora) + return address } diff --git a/qortal-ui-crypto/api/wallet/publicKeyToAddress.js b/qortal-ui-crypto/api/wallet/publicKeyToAddress.js index cd484903..1839a05b 100644 --- a/qortal-ui-crypto/api/wallet/publicKeyToAddress.js +++ b/qortal-ui-crypto/api/wallet/publicKeyToAddress.js @@ -1,37 +1,35 @@ -import RIPEMD160 from '../deps/ripemd160.js' +import Base58 from '../deps/Base58.js' import BROKEN_RIPEMD160 from '../deps/broken-ripemd160.js' +import RIPEMD160 from '../deps/ripemd160.js' +import utils from '../deps/utils.js' +import { ADDRESS_VERSION } from '../constants.js' +import { Buffer } from 'buffer' import { Sha256 } from 'asmcrypto.js' -import utils from '../deps/utils.js' -import Base58 from '../deps/Base58.js' -import { Buffer } from 'buffer' - -import { ADDRESS_VERSION } from '../constants.js' - const repeatSHA256 = (passphrase, hashes) => { - let hash = passphrase - for (let i = 0; i < hashes; i++) { - hash = new Sha256().process(hash).finish().result - } - return hash + let hash = passphrase + for (let i = 0; i < hashes; i++) { + hash = new Sha256().process(hash).finish().result + } + return hash } const publicKeyToAddress = (publicKey, qora = false) => { - const publicKeySha256 = new Sha256().process(publicKey).finish().result - const _publicKeyHash = qora ? new BROKEN_RIPEMD160().digest(publicKeySha256) : new RIPEMD160().update(Buffer.from(publicKeySha256)).digest('hex') + const publicKeySha256 = new Sha256().process(publicKey).finish().result + const _publicKeyHash = qora ? new BROKEN_RIPEMD160().digest(publicKeySha256) : new RIPEMD160().update(Buffer.from(publicKeySha256)).digest('hex') + const publicKeyHash = qora ? _publicKeyHash : _publicKeyHash - const publicKeyHash = qora ? _publicKeyHash : _publicKeyHash - let address = new Uint8Array() + let address = new Uint8Array() - address = utils.appendBuffer(address, [ADDRESS_VERSION]) - address = utils.appendBuffer(address, publicKeyHash) + address = utils.appendBuffer(address, [ADDRESS_VERSION]) + address = utils.appendBuffer(address, publicKeyHash) - const checkSum = repeatSHA256(address, 2) - address = utils.appendBuffer(address, checkSum.subarray(0, 4)) + const checkSum = repeatSHA256(address, 2) + address = utils.appendBuffer(address, checkSum.subarray(0, 4)) - address = Base58.encode(address) + address = Base58.encode(address) - return address + return address } export default publicKeyToAddress diff --git a/qortal-ui-crypto/api/wallet/validateAddress.js b/qortal-ui-crypto/api/wallet/validateAddress.js index 515773b1..e487a55e 100644 --- a/qortal-ui-crypto/api/wallet/validateAddress.js +++ b/qortal-ui-crypto/api/wallet/validateAddress.js @@ -1,12 +1,10 @@ import Base58 from '../deps/Base58.js' - export const validateAddress = (address) => { - const decodePubKey = Base58.decode(address) - - if (!(decodePubKey instanceof Uint8Array && decodePubKey.length == 25)) { - return false - } - return true + const decodePubKey = Base58.decode(address) + if (!(decodePubKey instanceof Uint8Array && decodePubKey.length == 25)) { + return false + } + return true } diff --git a/qortal-ui-crypto/config.js b/qortal-ui-crypto/config.js index 6fccb8cc..e17ca4f2 100644 --- a/qortal-ui-crypto/config.js +++ b/qortal-ui-crypto/config.js @@ -6,33 +6,32 @@ const configWatchers = [] const waitingForConfig = [] const subscribeToStore = () => { - if (!store) return setTimeout(() => subscribeToStore(), 50) // 0.05s + if (!store) return setTimeout(() => subscribeToStore(), 50) - store.subscribe(() => { - const cA = store.getState().app - const c = store.getState().config - if (!c.loaded) return - if (!loaded) waitingForConfig.forEach(r => r(cA)) - configWatchers.forEach(fn => fn(cA)) - config = cA - }) + store.subscribe(() => { + const cA = store.getState().app + const c = store.getState().config + if (!c.loaded) return + if (!loaded) waitingForConfig.forEach(r => r(cA)) + configWatchers.forEach(fn => fn(cA)) + config = cA + }) } subscribeToStore() export function getConfig() { - return config + return config } export function watchConfig(fn) { - // config ? fn(config) : void 0 - fn(config) - configWatchers.push(fn) + fn(config) + configWatchers.push(fn) } export function waitForConfig() { - return new Promise((resolve, reject) => { - if (config) return resolve(config) - waitingForConfig.push(resolve) - }) -} \ No newline at end of file + return new Promise((resolve, reject) => { + if (config) return resolve(config) + waitingForConfig.push(resolve) + }) +} diff --git a/qortal-ui-plugins/package.json b/qortal-ui-plugins/package.json index 65746f80..2484d020 100644 --- a/qortal-ui-plugins/package.json +++ b/qortal-ui-plugins/package.json @@ -63,9 +63,9 @@ "file-saver": "2.0.5", "highcharts": "10.3.2", "html-escaper": "3.0.3", - "lit": "2.6.0", + "lit": "2.6.1", "lit-translate": "2.0.1", - "rollup": "3.9.1", + "rollup": "3.10.0", "rollup-plugin-node-globals": "1.4.0", "rollup-plugin-progress": "1.1.2", "rollup-plugin-web-worker-loader": "1.6.1" diff --git a/qortal-ui-plugins/plugins/core/components/ChatPage.js b/qortal-ui-plugins/plugins/core/components/ChatPage.js index bf3bc2ab..ae418e1d 100644 --- a/qortal-ui-plugins/plugins/core/components/ChatPage.js +++ b/qortal-ui-plugins/plugins/core/components/ChatPage.js @@ -1140,7 +1140,6 @@ class ChatPage extends LitElement { ${translate("chatpage.cchange33")}