UNPKG

nethereum-codegen

Version:

Code generator of Nethereum and Ethereum integration classes and projects

171 lines 6.63 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.buildContract = void 0; var n = require('./Nethereum.Generators.DuoCode.js'); var functionAbi = Nethereum.Generators.Model.FunctionABI; var eventAbi = Nethereum.Generators.Model.EventABI; var constructorAbi = Nethereum.Generators.Model.ConstructorABI; var contractAbi = Nethereum.Generators.Model.ContractABI; var parameterAbi = Nethereum.Generators.Model.ParameterABI; var structAbi = Nethereum.Generators.Model.StructABI; var errorAbi = Nethereum.Generators.Model.ErrorABI; function buildConstructor(item) { var constructorItem = new constructorAbi(); constructorItem.set_InputParameters(buildFunctionParameters(item.inputs)); return constructorItem; } function buildFunction(item, contractAbi) { var constant = false; if (item.constant !== undefined) { constant = item.constant; } else { // for solidity >=0.6.0 if (item.stateMutability !== undefined && (item.stateMutability === "view" || item.stateMutability === "pure")) constant = true; } var functionItem = new functionAbi(item.name, constant, contractAbi, false); functionItem.set_InputParameters(buildFunctionParameters(item.inputs)); functionItem.set_OutputParameters(buildFunctionParameters(item.outputs)); return functionItem; } function buildEvent(item, contractAbi) { var eventItem = new eventAbi(item.name, contractAbi); eventItem.set_InputParameters(buildEventParameters(item.inputs)); return eventItem; } function buildError(item, contractAbi) { var errorItem = new errorAbi(item.name, contractAbi); errorItem.set_InputParameters(buildFunctionParameters(item.inputs)); return errorItem; } function getStructTypeName(item) { if (item.internalType !== undefined && item.internalType.startsWith("struct")) { const length = 'struct '.length; const internalTypeName = item.internalType; let structName = internalTypeName.substring(length); if (structName.indexOf(".") > -1) { structName = structName.substring(structName.lastIndexOf(".") + 1); } if (structName.indexOf("[") > 0) { structName = structName.substring(0, structName.indexOf("[")); } return structName; } // simple hack until 0.5.8 type name is the same as the parameter name return item.name; } function buildStructsFromParameters(items) { var structs = []; if (items !== null && items !== undefined) { for (var i = 0, len = items.length; i < len; i++) { if (items[i].type.startsWith("tuple")) { structs = structs.concat(buildStructsFromTuple(items[i])); } } } return structs; } function buildStructsFromTuple(item) { var structs = []; var struct = new structAbi(getStructTypeName(item)); var parameterOrder = 0; var parameters = []; for (var x = 0, len = item.components.length; x < len; x++) { var component = item.components[x]; parameterOrder = parameterOrder + 1; if (component.type.startsWith("tuple")) { var parameter = new parameterAbi.ctor$1(component.type, component.name, parameterOrder, getStructTypeName(component)); structs = structs.concat(buildStructsFromTuple(component)); } else { var parameter = new parameterAbi.ctor$1(component.type, component.name, parameterOrder); } parameters.push(parameter); } struct.set_InputParameters(parameters); structs.push(struct); return structs; } function buildFunctionParameters(items) { let parameterOrder = 0; const parameters = []; for (let i = 0, len = items.length; i < len; i++) { parameterOrder = parameterOrder + 1; if (items[i].type.startsWith("tuple")) { var parameter = new parameterAbi.ctor$1(items[i].type, items[i].name, parameterOrder, getStructTypeName(items[i])); } else { var parameter = new parameterAbi.ctor$1(items[i].type, items[i].name, parameterOrder); } parameters.push(parameter); } return parameters; } function buildEventParameters(items) { let parameterOrder = 0; const parameters = []; for (let i = 0, len = items.length; i < len; i++) { parameterOrder = parameterOrder + 1; if (items[i].type.startsWith("tuple")) { var parameter = new parameterAbi.ctor$1(items[i].type, items[i].name, parameterOrder, getStructTypeName(items[i])); } else { var parameter = new parameterAbi.ctor$1(items[i].type, items[i].name, parameterOrder); } parameter.set_Indexed(items[i].indexed); parameters.push(parameter); } return parameters; } function buildContract(abiStr) { const abi = JSON.parse(abiStr); const functions = []; const events = []; const errors = []; const structs = []; let constructor = new constructorAbi(); const contract = new contractAbi(); for (let i = 0, len = abi.length; i < len; i++) { if (abi[i].type === "function") { let functionItem = buildFunction(abi[i], contract); if (functionItem.get_Name() == "nonce") { let x = 1; } if (functionItem.get_Constant() && abi[i].outputs.length == 0) { } else { functions.push(functionItem); const temp = buildStructsFromParameters(abi[i].outputs); for (const item of temp) { if (!structs.some(x => x.get_Name() === item.get_Name())) { structs.push(item); } } } } if (abi[i].type === "event") { events.push(buildEvent(abi[i], contract)); } if (abi[i].type === "error") { errors.push(buildError(abi[i], contract)); } if (abi[i].type === "constructor") { constructor = buildConstructor(abi[i]); } const temp = buildStructsFromParameters(abi[i].inputs); for (const item of temp) { if (!structs.some(x => x.get_Name() === item.get_Name())) { structs.push(item); } } } contract.set_Constructor(constructor); contract.set_Functions(functions); contract.set_Events(events); contract.set_Errors(errors); contract.set_Structs(structs); return contract; } exports.buildContract = buildContract; //# sourceMappingURL=AbiDeserialiser.js.map