Merge branch 'master' of https://github.com/ethereum/remix-project into newFEdesktop
commit
408bf81cec
@ -0,0 +1,170 @@ |
|||||||
|
import React from 'react' |
||||||
|
import { ViewPlugin } from '@remixproject/engine-web' |
||||||
|
import {PluginViewWrapper} from '@remix-ui/helper' |
||||||
|
import { RemixAppManager } from '../../remixAppManager' |
||||||
|
import { RemixUiVyperCompileDetails } from '@remix-ui/vyper-compile-details' |
||||||
|
import { ThemeKeys, ThemeObject } from '@microlink/react-json-view' |
||||||
|
//@ts-ignore
|
||||||
|
const _paq = (window._paq = window._paq || []) |
||||||
|
|
||||||
|
const profile = { |
||||||
|
name: 'vyperCompilationDetails', |
||||||
|
displayName: 'Vyper Compile Details', |
||||||
|
description: 'Displays details from vyper compiler', |
||||||
|
location: 'mainPanel', |
||||||
|
methods: ['showDetails'], |
||||||
|
events: [] |
||||||
|
} |
||||||
|
|
||||||
|
export class VyperCompilationDetailsPlugin extends ViewPlugin { |
||||||
|
dispatch: React.Dispatch<any> = () => {} |
||||||
|
appManager: RemixAppManager |
||||||
|
element: HTMLDivElement |
||||||
|
payload: any |
||||||
|
themeStyle: any |
||||||
|
theme: ThemeKeys | ThemeObject |
||||||
|
constructor(appManager: RemixAppManager) { |
||||||
|
super(profile) |
||||||
|
this.appManager = appManager |
||||||
|
this.element = document.createElement('div') |
||||||
|
this.element.setAttribute('id', 'vypercompileDetails') |
||||||
|
this.payload = { |
||||||
|
contractProperties: {} as any, |
||||||
|
selectedContract: '', |
||||||
|
help: {} as any, |
||||||
|
insertValue: {} as any, |
||||||
|
saveAs: {} as any, |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
async onActivation() { |
||||||
|
this.handleThemeChange() |
||||||
|
await this.call('tabs', 'focus', 'vyperCompilationDetails') |
||||||
|
this.renderComponent() |
||||||
|
_paq.push(['trackEvent', 'plugin', 'activated', 'vyperCompilationDetails']) |
||||||
|
} |
||||||
|
|
||||||
|
onDeactivation(): void { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
async showDetails(sentPayload: any) { |
||||||
|
const contractName = Object.entries(sentPayload).find(([key, value]) => key ) |
||||||
|
await this.call('tabs', 'focus', 'vyperCompilationDetails') |
||||||
|
this.profile.displayName = `${contractName}` |
||||||
|
this.payload = sentPayload |
||||||
|
const active = await this.call('theme', 'currentTheme') |
||||||
|
if (active.quality === 'dark') { |
||||||
|
switch(active.name) { |
||||||
|
case 'HackerOwl': |
||||||
|
this.theme = 'harmonic' |
||||||
|
this.themeStyle = { backgroundColor: active.backgroundColor } |
||||||
|
break |
||||||
|
case 'Black': |
||||||
|
this.theme = 'eighties' |
||||||
|
this.themeStyle = { backgroundColor: active.backgroundColor } |
||||||
|
break |
||||||
|
case 'Cyborg': |
||||||
|
this.theme = 'shapeshifter' |
||||||
|
this.themeStyle = { backgroundColor: active.backgroundColor } |
||||||
|
break |
||||||
|
case 'Dark': |
||||||
|
this.theme = 'flat' |
||||||
|
this.themeStyle = { backgroundColor: active.backgroundColor } |
||||||
|
break |
||||||
|
default: |
||||||
|
this.theme = 'shapeshifter' |
||||||
|
this.themeStyle = { backgroundColor: active.backgroundColor } |
||||||
|
break |
||||||
|
} |
||||||
|
} else { |
||||||
|
switch(active.name) { |
||||||
|
case 'Candy': |
||||||
|
this.theme = 'apathy:inverted' |
||||||
|
this.themeStyle = { backgroundColor: active.backgroundColor } |
||||||
|
break |
||||||
|
case 'Midcentury': |
||||||
|
this.theme = 'apathy:inverted' |
||||||
|
this.themeStyle = { backgroundColor: active.backgroundColor } |
||||||
|
break |
||||||
|
case 'Unicorn': |
||||||
|
this.theme = 'apathy:inverted' |
||||||
|
this.themeStyle = { backgroundColor: active.backgroundColor } |
||||||
|
break |
||||||
|
case 'Violet': |
||||||
|
this.theme = 'summerfruit:inverted' |
||||||
|
this.themeStyle = { backgroundColor: active.backgroundColor } |
||||||
|
break |
||||||
|
default: |
||||||
|
this.theme = 'bright:inverted' |
||||||
|
break |
||||||
|
} |
||||||
|
} |
||||||
|
this.renderComponent() |
||||||
|
} |
||||||
|
|
||||||
|
private handleThemeChange() { |
||||||
|
this.on('theme', 'themeChanged', (theme: any) => { |
||||||
|
if (theme.quality === 'dark') { |
||||||
|
switch(theme.name) { |
||||||
|
case 'HackerOwl': |
||||||
|
this.theme = 'solarized' |
||||||
|
this.themeStyle = { backgroundColor: theme.backgroundColor } |
||||||
|
break |
||||||
|
case 'Black': |
||||||
|
this.theme = 'shapeshifter' |
||||||
|
this.themeStyle = { backgroundColor: theme.backgroundColor } |
||||||
|
break |
||||||
|
case 'Cyborg': |
||||||
|
this.theme = 'shapeshifter' |
||||||
|
this.themeStyle = { backgroundColor: theme.backgroundColor } |
||||||
|
break |
||||||
|
case 'Dark': |
||||||
|
this.theme = 'harmonic' |
||||||
|
this.themeStyle = { backgroundColor: theme.backgroundColor } |
||||||
|
break |
||||||
|
default: |
||||||
|
this.theme = 'shapeshifter' |
||||||
|
this.themeStyle = { backgroundColor: theme.backgroundColor } |
||||||
|
break |
||||||
|
} |
||||||
|
} else { |
||||||
|
this.theme = 'bright:inverted' |
||||||
|
this.themeStyle = { backgroundColor: theme.backgroundColor } |
||||||
|
} |
||||||
|
this.renderComponent() |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
setDispatch(dispatch: React.Dispatch<any>): void { |
||||||
|
this.dispatch = dispatch |
||||||
|
this.renderComponent() |
||||||
|
} |
||||||
|
render() { |
||||||
|
return ( |
||||||
|
<div id="compileDetails"> |
||||||
|
<PluginViewWrapper plugin={this} /> |
||||||
|
</div> |
||||||
|
) |
||||||
|
} |
||||||
|
|
||||||
|
renderComponent() { |
||||||
|
this.dispatch({ |
||||||
|
...this, |
||||||
|
...this.payload, |
||||||
|
themeStyle: this.themeStyle, |
||||||
|
theme: this.theme |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
updateComponent(state: any) { |
||||||
|
return ( |
||||||
|
<RemixUiVyperCompileDetails |
||||||
|
payload={state.payload} |
||||||
|
theme={state.theme} |
||||||
|
themeStyle={state.themeStyle} |
||||||
|
/> |
||||||
|
) |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,540 @@ |
|||||||
|
import {CompilationResult, ABIDescription} from '@remixproject/plugin-api' |
||||||
|
|
||||||
|
export interface VyperCompilationResult { |
||||||
|
status: 'success' |
||||||
|
bytecode: string |
||||||
|
bytecode_runtime: string |
||||||
|
abi: ABIDescription[] |
||||||
|
ir: string |
||||||
|
method_identifiers: { |
||||||
|
[method: string]: string |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
export interface VyperCompilationError { |
||||||
|
status: 'failed' |
||||||
|
column?: number |
||||||
|
line?: number |
||||||
|
message: string |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
export type VyperCompilationResultType = { |
||||||
|
buildDependencies: any |
||||||
|
compilers: [ |
||||||
|
contractTypes: [], |
||||||
|
name: string, |
||||||
|
settings: { |
||||||
|
optimize: boolean |
||||||
|
outputSelection: { |
||||||
|
['fileName']: { |
||||||
|
['contractName']: string[] |
||||||
|
} |
||||||
|
} |
||||||
|
version: string |
||||||
|
} |
||||||
|
] |
||||||
|
contractTypes: { |
||||||
|
['fileName']: { |
||||||
|
abi: any[] |
||||||
|
ast: { |
||||||
|
name: string, |
||||||
|
children: any[] |
||||||
|
classification: number |
||||||
|
col_offset: number |
||||||
|
end_col_offset: number |
||||||
|
end_lineno: number |
||||||
|
lineno: number |
||||||
|
src: { |
||||||
|
length: number |
||||||
|
jump_code: string |
||||||
|
} |
||||||
|
} |
||||||
|
contractName: string |
||||||
|
deploymentBytecode: { |
||||||
|
bytecode: string |
||||||
|
} |
||||||
|
dev_messages: any |
||||||
|
devdoc: { |
||||||
|
methods: any |
||||||
|
} |
||||||
|
pcmap: any |
||||||
|
runtimeBytecode: { |
||||||
|
bytecode: string |
||||||
|
} |
||||||
|
sourceId: string |
||||||
|
sourcemap: string |
||||||
|
userdoc: { |
||||||
|
methods: any |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
deployments: any |
||||||
|
manifest: string |
||||||
|
meta: any |
||||||
|
sources: { |
||||||
|
['fileName'] : { |
||||||
|
checksum: any |
||||||
|
content: string |
||||||
|
imports: string[] |
||||||
|
references: [] |
||||||
|
urls: [] |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
export interface PackageManifest { |
||||||
|
title: string; |
||||||
|
description: string; |
||||||
|
type: TypeEnum; |
||||||
|
required: string[]; |
||||||
|
version: string; |
||||||
|
properties: PackageManifestProperties; |
||||||
|
definitions: Definitions; |
||||||
|
} |
||||||
|
|
||||||
|
export interface Definitions { |
||||||
|
packageMeta: ByteString; |
||||||
|
contractType: ByteString; |
||||||
|
contractInstance: ContractInstance; |
||||||
|
byteString: ByteString; |
||||||
|
bytecodeObject: BytecodeObject; |
||||||
|
linkReference: LinkReference; |
||||||
|
linkValue: LinkValue; |
||||||
|
identifier: ByteString; |
||||||
|
contractInstanceName: ByteString; |
||||||
|
deployment: Deployment; |
||||||
|
packageContractInstanceName: ByteString; |
||||||
|
compilerInformation: CompilerInformation; |
||||||
|
address: Address; |
||||||
|
transactionHash: Address; |
||||||
|
blockHash: Address; |
||||||
|
contentURI: ByteString; |
||||||
|
} |
||||||
|
|
||||||
|
export interface Address { |
||||||
|
title: string; |
||||||
|
description: string; |
||||||
|
allOf: AllOf[]; |
||||||
|
} |
||||||
|
|
||||||
|
export interface AllOf { |
||||||
|
ref?: string; |
||||||
|
minLength?: number; |
||||||
|
maxLength?: number; |
||||||
|
} |
||||||
|
|
||||||
|
export interface ByteStringProperties { |
||||||
|
contractName?: ByteString; |
||||||
|
deploymentBytecode?: Meta; |
||||||
|
runtimeBytecode?: Meta; |
||||||
|
abi?: ByteString; |
||||||
|
natspec?: ByteString; |
||||||
|
compiler?: Meta; |
||||||
|
authors?: ByteString; |
||||||
|
license?: ByteString; |
||||||
|
description?: ByteString; |
||||||
|
keywords?: ByteString; |
||||||
|
links?: Links; |
||||||
|
} |
||||||
|
|
||||||
|
export interface ByteString { |
||||||
|
title: string; |
||||||
|
description?: string; |
||||||
|
type: TypeEnum; |
||||||
|
pattern?: string; |
||||||
|
format?: string; |
||||||
|
items?: Items; |
||||||
|
properties?: ByteStringProperties; |
||||||
|
patternProperties?: { [key: string]: Meta }; |
||||||
|
} |
||||||
|
|
||||||
|
export interface Meta { |
||||||
|
ref: string; |
||||||
|
} |
||||||
|
|
||||||
|
export interface Links { |
||||||
|
title: string; |
||||||
|
descriptions: string; |
||||||
|
type: TypeEnum; |
||||||
|
additionalProperties: AdditionalProperties; |
||||||
|
} |
||||||
|
|
||||||
|
export interface AdditionalProperties { |
||||||
|
type: TypeEnum; |
||||||
|
format: string; |
||||||
|
} |
||||||
|
|
||||||
|
export type TypeEnum = "string" | "array" | "object"; |
||||||
|
|
||||||
|
export interface Items { |
||||||
|
ref?: string; |
||||||
|
type?: TypeEnum; |
||||||
|
} |
||||||
|
|
||||||
|
export interface BytecodeObject { |
||||||
|
title: string |
||||||
|
type: TypeEnum |
||||||
|
offsets: number[] |
||||||
|
anyOf: BytecodeObjectAnyOf[] |
||||||
|
properties: BytecodeObjectProperties |
||||||
|
bytecode: string |
||||||
|
linkReferences?: { offset?: any; length?: number; name?: string}[] |
||||||
|
} |
||||||
|
|
||||||
|
export interface BytecodeObjectAnyOf { |
||||||
|
required: string[]; |
||||||
|
} |
||||||
|
|
||||||
|
export interface BytecodeObjectProperties { |
||||||
|
bytecode: Meta; |
||||||
|
linkReferences: Link; |
||||||
|
linkDependencies: Link; |
||||||
|
} |
||||||
|
|
||||||
|
export interface Link { |
||||||
|
type: TypeEnum; |
||||||
|
items: Meta; |
||||||
|
} |
||||||
|
|
||||||
|
export interface CompilerInformation { |
||||||
|
title: string; |
||||||
|
description: string; |
||||||
|
type: TypeEnum; |
||||||
|
required: string[]; |
||||||
|
properties: CompilerInformationProperties; |
||||||
|
} |
||||||
|
|
||||||
|
export interface CompilerInformationProperties { |
||||||
|
name: Name; |
||||||
|
version: Name; |
||||||
|
settings: Name; |
||||||
|
} |
||||||
|
|
||||||
|
export interface Name { |
||||||
|
description: string; |
||||||
|
type: TypeEnum; |
||||||
|
} |
||||||
|
|
||||||
|
export interface ContractInstance { |
||||||
|
title: string; |
||||||
|
description: string; |
||||||
|
type: TypeEnum; |
||||||
|
required: string[]; |
||||||
|
properties: ContractInstanceProperties; |
||||||
|
} |
||||||
|
|
||||||
|
export interface ContractInstanceProperties { |
||||||
|
contractType: ByteString; |
||||||
|
address: Meta; |
||||||
|
transaction: Meta; |
||||||
|
block: Meta; |
||||||
|
runtimeBytecode: Meta; |
||||||
|
compiler: Meta; |
||||||
|
linkDependencies: ByteString; |
||||||
|
} |
||||||
|
|
||||||
|
export interface Deployment { |
||||||
|
title: string; |
||||||
|
type: TypeEnum; |
||||||
|
patternProperties: DeploymentPatternProperties; |
||||||
|
} |
||||||
|
|
||||||
|
export interface DeploymentPatternProperties { |
||||||
|
aZAZAZAZ09_0254$: Meta; |
||||||
|
} |
||||||
|
|
||||||
|
export interface LinkReference { |
||||||
|
title: string; |
||||||
|
description: string; |
||||||
|
type: TypeEnum; |
||||||
|
required: string[]; |
||||||
|
properties: LinkReferenceProperties; |
||||||
|
} |
||||||
|
|
||||||
|
export interface LinkReferenceProperties { |
||||||
|
offsets: Offsets; |
||||||
|
length: Length; |
||||||
|
name: Meta; |
||||||
|
} |
||||||
|
|
||||||
|
export interface Length { |
||||||
|
type: string; |
||||||
|
minimum: number; |
||||||
|
} |
||||||
|
|
||||||
|
export interface Offsets { |
||||||
|
type: TypeEnum; |
||||||
|
items: Length; |
||||||
|
} |
||||||
|
|
||||||
|
export interface LinkValue { |
||||||
|
title: string; |
||||||
|
description: string; |
||||||
|
type: TypeEnum; |
||||||
|
required: string[]; |
||||||
|
properties: LinkValueProperties; |
||||||
|
oneOf: OneOf[]; |
||||||
|
} |
||||||
|
|
||||||
|
export interface OneOf { |
||||||
|
properties: OneOfProperties; |
||||||
|
} |
||||||
|
|
||||||
|
export interface OneOfProperties { |
||||||
|
type: TypeClass; |
||||||
|
value: PurpleValue; |
||||||
|
} |
||||||
|
|
||||||
|
export interface TypeClass { |
||||||
|
enum: string[]; |
||||||
|
} |
||||||
|
|
||||||
|
export interface PurpleValue { |
||||||
|
ref?: string; |
||||||
|
anyOf?: Meta[]; |
||||||
|
} |
||||||
|
|
||||||
|
export interface LinkValueProperties { |
||||||
|
offsets: Offsets; |
||||||
|
type: Name; |
||||||
|
value: FluffyValue; |
||||||
|
} |
||||||
|
|
||||||
|
export interface FluffyValue { |
||||||
|
description: string; |
||||||
|
} |
||||||
|
|
||||||
|
export interface PackageManifestProperties { |
||||||
|
manifestVersion: ManifestVersion; |
||||||
|
packageName: ByteString; |
||||||
|
meta: Meta; |
||||||
|
version: Version; |
||||||
|
sources: Sources; |
||||||
|
contractTypes: ByteString; |
||||||
|
deployments: ByteString; |
||||||
|
buildDependencies: BuildDependencies; |
||||||
|
} |
||||||
|
|
||||||
|
export interface BuildDependencies { |
||||||
|
title: string; |
||||||
|
type: TypeEnum; |
||||||
|
patternProperties: BuildDependenciesPatternProperties; |
||||||
|
} |
||||||
|
|
||||||
|
export interface BuildDependenciesPatternProperties { |
||||||
|
aZAZ090254$: Meta; |
||||||
|
} |
||||||
|
|
||||||
|
export interface ManifestVersion { |
||||||
|
type: TypeEnum; |
||||||
|
title: string; |
||||||
|
description: string; |
||||||
|
default: string; |
||||||
|
enum: string[]; |
||||||
|
} |
||||||
|
|
||||||
|
export interface Sources { |
||||||
|
title: string; |
||||||
|
type: TypeEnum; |
||||||
|
patternProperties: SourcesPatternProperties; |
||||||
|
} |
||||||
|
|
||||||
|
export interface SourcesPatternProperties { |
||||||
|
empty: Empty; |
||||||
|
} |
||||||
|
|
||||||
|
export interface Empty { |
||||||
|
anyOf: AnyOf[]; |
||||||
|
} |
||||||
|
|
||||||
|
export interface AnyOf { |
||||||
|
title?: string; |
||||||
|
type?: TypeEnum; |
||||||
|
ref?: string; |
||||||
|
} |
||||||
|
|
||||||
|
export interface Version { |
||||||
|
title: string; |
||||||
|
type: TypeEnum; |
||||||
|
} |
||||||
|
|
||||||
|
export type CompileFormat = { |
||||||
|
contractTypes: { |
||||||
|
abi?: ABI[] |
||||||
|
ast?: AST |
||||||
|
contractName?: string |
||||||
|
depolymentBytecode?: BytecodeObject |
||||||
|
devMessages?: { [key: string]: string } |
||||||
|
devdoc?: Devdoc |
||||||
|
methodIdentifiers?: { [key: string]: string } |
||||||
|
pcmap?: any |
||||||
|
runtimeBytecode?: BytecodeObject |
||||||
|
sourceId?: string |
||||||
|
sourcemap?: string |
||||||
|
userdoc?: { [key: string]: string } |
||||||
|
} |
||||||
|
manifest?: string |
||||||
|
sources?: { |
||||||
|
[fileName: string]: { |
||||||
|
content: string |
||||||
|
urls?: string[] |
||||||
|
references?: string[] |
||||||
|
imports?: string[] |
||||||
|
checksum?: { [key: string]: string } |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
export type Devdoc = { |
||||||
|
methods: any |
||||||
|
} |
||||||
|
|
||||||
|
export type ETHPM3Format = { |
||||||
|
manifest: 'ethpm/3' |
||||||
|
name: string |
||||||
|
version: string |
||||||
|
meta: Record<string, any> |
||||||
|
buildDependencies: Record<string, any> |
||||||
|
sources: { |
||||||
|
[fileName: string]: { |
||||||
|
content: string |
||||||
|
checksum?: { |
||||||
|
keccak256: string |
||||||
|
hash: string |
||||||
|
} |
||||||
|
type?: any |
||||||
|
license?: string |
||||||
|
} |
||||||
|
} |
||||||
|
compilers: CompilerInformationObject[] |
||||||
|
contractTypes: { |
||||||
|
contractName: string |
||||||
|
sourceId?: string |
||||||
|
depolymentBytecode: { |
||||||
|
bytecode: string |
||||||
|
linkReferences: { |
||||||
|
offset: any |
||||||
|
length: number |
||||||
|
name?: string |
||||||
|
} |
||||||
|
linkDependencies?: { offsets: number[]} |
||||||
|
} |
||||||
|
runtimeBytecode: { |
||||||
|
bytecode: string |
||||||
|
linkReferences: { |
||||||
|
offset: any |
||||||
|
length: number |
||||||
|
name?: string |
||||||
|
} |
||||||
|
linkDependencies?: LinkValueObject |
||||||
|
} |
||||||
|
abi: ABI[] |
||||||
|
ast: AST |
||||||
|
userDoc?: { |
||||||
|
methods: any |
||||||
|
notice: string |
||||||
|
} |
||||||
|
devDoc?: { |
||||||
|
methods: any, |
||||||
|
author: string |
||||||
|
details: string |
||||||
|
title: string |
||||||
|
license: string |
||||||
|
} |
||||||
|
} |
||||||
|
deployments: { |
||||||
|
[contractName: string]: ContractInstanceObject |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
export type CompilerInformationObject = { |
||||||
|
name: string |
||||||
|
version: string |
||||||
|
settings?: { |
||||||
|
optimizer: { |
||||||
|
enabled: boolean |
||||||
|
runs: number |
||||||
|
} |
||||||
|
outputSelection: { |
||||||
|
[fileName: string]: { |
||||||
|
[contractName: string]: string[] |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
contractTypes?: string[] |
||||||
|
} |
||||||
|
|
||||||
|
export type LinkValueObject = { |
||||||
|
offsets: number[] |
||||||
|
type: string |
||||||
|
value: string |
||||||
|
} |
||||||
|
|
||||||
|
export type PackageMetaDataObject = { |
||||||
|
authors?: string[] |
||||||
|
description?: string |
||||||
|
keywords?: string[] |
||||||
|
license?: string |
||||||
|
links?: { |
||||||
|
[key: string]: string |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
export type ContractInstanceObject = { |
||||||
|
contractType: string |
||||||
|
address: string |
||||||
|
transaction?: string |
||||||
|
block?: string |
||||||
|
runtimeBytecode?: BytecodeObject |
||||||
|
compiler?: string |
||||||
|
linkDependencies?: LinkValueObject |
||||||
|
} |
||||||
|
|
||||||
|
export type ASTSrc = { |
||||||
|
jumpCode: string; |
||||||
|
length: number; |
||||||
|
} |
||||||
|
|
||||||
|
export type Child = { |
||||||
|
astType: string; |
||||||
|
children: Child[]; |
||||||
|
classification: number; |
||||||
|
colOffset: number; |
||||||
|
endColOffset: number; |
||||||
|
endLineno: number; |
||||||
|
lineno: number; |
||||||
|
name?: string; |
||||||
|
src: ChildSrc; |
||||||
|
docStr?: Child; |
||||||
|
} |
||||||
|
|
||||||
|
export type ChildSrc = { |
||||||
|
jumpCode: string; |
||||||
|
length: number; |
||||||
|
start: number; |
||||||
|
} |
||||||
|
|
||||||
|
export type AST = { |
||||||
|
astType: string; |
||||||
|
children: Child[]; |
||||||
|
classification: number; |
||||||
|
colOffset: number; |
||||||
|
endColOffset: number; |
||||||
|
endLineno: number; |
||||||
|
lineno: number; |
||||||
|
name: string; |
||||||
|
src: ASTSrc; |
||||||
|
} |
||||||
|
|
||||||
|
export type ABI = { |
||||||
|
anonymous?: boolean; |
||||||
|
inputs: any[]; |
||||||
|
name?: string; |
||||||
|
type: any |
||||||
|
stateMutability?: any; |
||||||
|
outputs?: any[]; |
||||||
|
} |
@ -0,0 +1,65 @@ |
|||||||
|
import { CopyToClipboard } from '@remix-ui/clipboard' |
||||||
|
import { CustomTooltip } from '@remix-ui/helper' |
||||||
|
import { ContractPropertyName } from '@remix-ui/solidity-compiler' |
||||||
|
import React from 'react' |
||||||
|
import { TreeView, TreeViewItem } from '@remix-ui/tree-view' |
||||||
|
import { useIntl } from 'react-intl' |
||||||
|
const _paq = (window._paq = window._paq || []) |
||||||
|
|
||||||
|
|
||||||
|
export default function SolidityCompile({ contractProperties, selectedContract, help, insertValue, saveAs, plugin }: any) { |
||||||
|
const intl = useIntl() |
||||||
|
const downloadFn = () => { |
||||||
|
_paq.push(['trackEvent', 'compiler', 'compilerDetails', 'download']) |
||||||
|
saveAs(new Blob([JSON.stringify(contractProperties, null, '\t')]), `${selectedContract}_compData.json`) |
||||||
|
} |
||||||
|
return ( |
||||||
|
<> |
||||||
|
<div className="d-flex justify-content-between align-items-center mr-1"> |
||||||
|
<span className="lead">{selectedContract}</span> |
||||||
|
<CustomTooltip tooltipText={intl.formatMessage({id: 'solidity.compileDetails'})}> |
||||||
|
<span className="btn btn-outline-success border-success mr-1" onClick={downloadFn}>Download</span> |
||||||
|
</CustomTooltip> |
||||||
|
</div> |
||||||
|
<div className="remixui_detailsJSON"> |
||||||
|
{<TreeView> |
||||||
|
{Object.keys(contractProperties).map((propertyName: ContractPropertyName, index) => { |
||||||
|
const copyDetails = ( |
||||||
|
<span className="remixui_copyDetails"> |
||||||
|
<CopyToClipboard tip={intl.formatMessage({id: 'solidity.copy'})} content={contractProperties[propertyName]} direction="top" /> |
||||||
|
</span> |
||||||
|
) |
||||||
|
const questionMark = ( |
||||||
|
<span className="remixui_questionMark"> |
||||||
|
<i |
||||||
|
title={intl.formatMessage({ |
||||||
|
id: `solidity.${propertyName}`, |
||||||
|
defaultMessage: help[propertyName] |
||||||
|
})} |
||||||
|
className="fas fa-question-circle" |
||||||
|
aria-hidden="true" |
||||||
|
></i> |
||||||
|
</span> |
||||||
|
) |
||||||
|
|
||||||
|
return ( |
||||||
|
<div className="remixui_log" key={index}> |
||||||
|
<TreeViewItem |
||||||
|
label={ |
||||||
|
<div data-id={`remixui_treeviewitem_${propertyName}`} className="remixui_key"> |
||||||
|
{propertyName} {copyDetails} {questionMark} |
||||||
|
</div> |
||||||
|
} |
||||||
|
expand={propertyName === 'metadata' || propertyName === 'bytecode' ? true : false} |
||||||
|
iconY='fas fa-caret-down' |
||||||
|
> |
||||||
|
{insertValue(contractProperties, propertyName)} |
||||||
|
</TreeViewItem> |
||||||
|
</div> |
||||||
|
) |
||||||
|
})} |
||||||
|
</TreeView>} |
||||||
|
</div> |
||||||
|
</> |
||||||
|
) |
||||||
|
} |
@ -0,0 +1 @@ |
|||||||
|
export * from './lib/vyper-compile-details' |
@ -0,0 +1,28 @@ |
|||||||
|
import React from 'react' |
||||||
|
import VyperCompile from './vyperCompile' |
||||||
|
import { ThemeKeys, ThemeObject } from '@microlink/react-json-view' |
||||||
|
|
||||||
|
|
||||||
|
interface RemixUiVyperCompileDetailsProps { |
||||||
|
payload: any |
||||||
|
theme?: ThemeKeys | ThemeObject |
||||||
|
themeStyle?: any |
||||||
|
} |
||||||
|
|
||||||
|
export function RemixUiVyperCompileDetails({ payload, theme, themeStyle }: RemixUiVyperCompileDetailsProps) { |
||||||
|
const dpayload = Object.values(payload) as any ?? {} |
||||||
|
const bcode = dpayload[0].bytecode ? dpayload[0].bytecode.object : '' |
||||||
|
const runtimeBcode = dpayload[0].runtimeBytecode ? dpayload[0].runtimeBytecode.object : '' |
||||||
|
const ir = dpayload[0].ir |
||||||
|
const methodIdentifiers= dpayload[0].methodIdentifiers |
||||||
|
const abi= dpayload[0].abi |
||||||
|
return ( |
||||||
|
<> |
||||||
|
<VyperCompile |
||||||
|
result={{bytecode: bcode, bytecodeRuntime: runtimeBcode, ir: ir, methodIdentifiers: methodIdentifiers, abi: abi}} |
||||||
|
theme={theme} |
||||||
|
themeStyle={themeStyle} |
||||||
|
/> |
||||||
|
</> |
||||||
|
) |
||||||
|
} |
@ -0,0 +1,85 @@ |
|||||||
|
import { CopyToClipboard } from '@remix-ui/clipboard' |
||||||
|
import JSONTree, { ThemeKeys, ThemeObject } from '@microlink/react-json-view' |
||||||
|
import React, { useState } from 'react' |
||||||
|
import Tabs from 'react-bootstrap/Tabs' |
||||||
|
import Tab from 'react-bootstrap/Tab' |
||||||
|
import Button from 'react-bootstrap/Button' |
||||||
|
import { ABIDescription } from '@remixproject/plugin-api' |
||||||
|
const _paq = (window._paq = window._paq || []) |
||||||
|
|
||||||
|
export interface VyperCompilationResult { |
||||||
|
status?: 'success' |
||||||
|
bytecode: string |
||||||
|
bytecodeRuntime: string |
||||||
|
abi: ABIDescription[] |
||||||
|
ir: string |
||||||
|
methodIdentifiers: { |
||||||
|
[method: string]: string |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
export interface VyperCompileProps { |
||||||
|
result: VyperCompilationResult |
||||||
|
theme?: ThemeKeys | ThemeObject |
||||||
|
themeStyle?: any |
||||||
|
} |
||||||
|
|
||||||
|
export default function VyperCompile({result, theme, themeStyle}: VyperCompileProps) { |
||||||
|
|
||||||
|
const [active, setActive] = useState<keyof VyperCompilationResult>('abi') |
||||||
|
const tabContent = [ |
||||||
|
{ |
||||||
|
tabHeadingText: 'ABI', |
||||||
|
tabPayload: result.abi, |
||||||
|
tabMemberType: 'abi', |
||||||
|
tabButtonText: () => 'Copy ABI', |
||||||
|
eventKey: 'abi' |
||||||
|
}, |
||||||
|
{ |
||||||
|
tabHeadingText: 'Bytecode', |
||||||
|
tabPayload: result.bytecode, |
||||||
|
tabMemberType: 'bytecode', |
||||||
|
tabButtonText: () => 'Copy Bytecode', |
||||||
|
eventKey: 'bytecode' |
||||||
|
}, |
||||||
|
{ |
||||||
|
tabHeadingText: 'Runtime Bytecode', |
||||||
|
tabPayload: result.bytecodeRuntime, |
||||||
|
tabMemberType: 'bytecode_runtime', |
||||||
|
tabButtonText: () => 'Copy Runtime Bytecode', |
||||||
|
eventKey: 'bytecode_runtime' |
||||||
|
} |
||||||
|
] |
||||||
|
|
||||||
|
return ( |
||||||
|
<> |
||||||
|
<Tabs id="result" activeKey={active} onSelect={(key: any) => setActive(key)} justify> |
||||||
|
{tabContent.map((content, index) => ( |
||||||
|
<Tab eventKey={content.eventKey} title={content.tabHeadingText} as={'span'} key={`${index}-${content.eventKey}`}> |
||||||
|
<div className="d-flex flex-column w-75 justify-content-center mx-auto rounded-2"> |
||||||
|
<CopyToClipboard getContent={() => (content.eventKey !== 'abi' ? content.tabPayload : JSON.stringify(result['abi']))}> |
||||||
|
<Button variant="info" className="copy mt-3 ml-2" data-id={content.eventKey === 'abi' ? 'copy-abi' : ''}> |
||||||
|
<span className="far fa-copy mr-2"></span> |
||||||
|
{content.tabButtonText()} |
||||||
|
</Button> |
||||||
|
</CopyToClipboard> |
||||||
|
{content.eventKey === 'abi' ? ( |
||||||
|
<div className="my-3"> |
||||||
|
<JSONTree |
||||||
|
src={content.tabPayload as ABIDescription[]} |
||||||
|
theme={theme} |
||||||
|
style={themeStyle} |
||||||
|
/> |
||||||
|
</div> |
||||||
|
) : ( |
||||||
|
<div className="w-100 mt-2 p-2 mx-auto"> |
||||||
|
<textarea className="form-control rounded-2" defaultValue={content.tabPayload as string} rows={15}></textarea> |
||||||
|
</div> |
||||||
|
)} |
||||||
|
</div> |
||||||
|
</Tab> |
||||||
|
))} |
||||||
|
</Tabs> |
||||||
|
</> |
||||||
|
) |
||||||
|
} |
Loading…
Reference in new issue