UNPKG

@pendulum-chain/api-solang

Version:

Interface to interact with smart contracts compiled via Solang

61 lines (60 loc) 2.34 kB
import { CodePromise } from "@polkadot/api-contract"; import { getSignerAddress, signAndSubmitExtrinsic, } from "./submitExtrinsic.js"; import { rpcInstantiate } from "./contractRpc.js"; export async function basicDeployContract({ api, abi, constructorArguments, constructorName, limits, signer, skipDryRunning, modifyExtrinsic, }) { const code = new CodePromise(api, abi, undefined); constructorName = constructorName ?? "new"; try { abi.findConstructor(constructorName); } catch { throw new Error(`Contract has no constructor called ${constructorName}`); } let gasRequired; if (skipDryRunning === true) { gasRequired = api.createType("WeightV2", limits.gas); } else { const rpcResult = await rpcInstantiate({ api, abi, callerAddress: getSignerAddress(signer), constructorName, limits, constructorArguments, }); const { output } = rpcResult; gasRequired = rpcResult.gasRequired; switch (output.type) { case "reverted": case "panic": return output; case "error": return { type: "error", error: output.description ?? "unknown" }; } } const { storageDeposit: storageDepositLimit } = limits; let extrinsic = code.tx[constructorName]({ gasLimit: gasRequired, storageDepositLimit }, ...constructorArguments); if (modifyExtrinsic) { extrinsic = modifyExtrinsic(extrinsic); } const { eventRecords, status, transactionFee } = await signAndSubmitExtrinsic(extrinsic, signer); if (status.type === "error") { return { type: "error", error: `Contract could not be deployed: ${status.error}`, }; } let deploymentAddress = undefined; for (const eventRecord of eventRecords) { const { data, section, method } = eventRecord.event; if (section === "contracts" && method === "Instantiated") { const [, contract] = data; deploymentAddress = contract.toString(); } } if (deploymentAddress === undefined) { return { type: "error", error: "Contract address not found" }; } return { type: "success", deploymentAddress, eventRecords, transactionFee }; }