diff --git a/javascript/engine-js/src/AbstractTokenScript.ts b/javascript/engine-js/src/AbstractTokenScript.ts index 9d58fba..86ce8d4 100644 --- a/javascript/engine-js/src/AbstractTokenScript.ts +++ b/javascript/engine-js/src/AbstractTokenScript.ts @@ -1,4 +1,4 @@ -import { ethers } from 'ethers'; +import { ethers, Overrides } from 'ethers'; import { ITokenScriptEngine, ScriptSourceType } from './IEngine'; import { SecurityInfo } from './security/SecurityInfo'; import { TransactionValidator } from './security/TransactionValidator'; @@ -391,7 +391,7 @@ export abstract class AbstractTokenScript implements ITokenScript { listener({ status: 'started' }); - return await wallet.sendTransaction(contractAddr.chain, contractAddr.address, transInfo.function, ethParams, [], ethValue, waitForConfirmation, listener, errorAbi); + return await wallet.sendTransaction(contractAddr.chain, contractAddr.address, transInfo.function, ethParams, [], transInfo.overrides, ethValue, waitForConfirmation, listener, errorAbi); } public abstract getViewController(): any; diff --git a/javascript/engine-js/src/tokenScript/Transaction.ts b/javascript/engine-js/src/tokenScript/Transaction.ts index b48bb2d..96d3e2f 100644 --- a/javascript/engine-js/src/tokenScript/Transaction.ts +++ b/javascript/engine-js/src/tokenScript/Transaction.ts @@ -1,3 +1,4 @@ +import {Overrides} from "ethers"; import {EthUtils} from "../ethereum/EthUtils"; import {ITokenScript} from "../ITokenScript"; import {Attributes} from "./Attributes"; @@ -11,6 +12,7 @@ export interface ITransactionInfo { contractName: string, function: string args: Argument[], + overrides: Overrides, value?: Argument } @@ -47,6 +49,7 @@ export class Transaction { contractName: contractName, function: transInfo[0].getAttribute("function"), args: new Arguments(this.tokenScript, transInfo[0], this.localAttrContext).getArguments(), + overrides: this.getOverridesArgs(transInfo[0]), value: this.getValueArg(transInfo[0]) }; } @@ -68,6 +71,29 @@ export class Transaction { return new Argument(this.tokenScript, valueElem[0], "uint256", this.localAttrContext); } + /** + * Fetches the override for the transaction + * e.g. gasLimit for execute a transaction, more details please refer to ethers.js Overrides + * @param transInfo + * @private + */ + private getOverridesArgs(transInfo: Element): Overrides { + const overridesElem = transInfo.getElementsByTagName('ethereum:overrides'); + + if (overridesElem.length === 0) return null; + + const overrides: Overrides = {}; + const elems = overridesElem[0].children; + for (let i in elems) { + const override = elems[i]; + const type = override.tagName.split(':')[1]; + + overrides[override.getAttribute('name')] = EthUtils.encodeTransactionParameter(type, override.textContent); + } + + return overrides; + } + public getTransactionInfo() { return this.transaction; }; diff --git a/javascript/engine-js/src/wallet/EthersAdapter.ts b/javascript/engine-js/src/wallet/EthersAdapter.ts index 4903209..7726cce 100644 --- a/javascript/engine-js/src/wallet/EthersAdapter.ts +++ b/javascript/engine-js/src/wallet/EthersAdapter.ts @@ -59,7 +59,7 @@ export class EthersAdapter implements IWalletAdapter { return (await contract.getFunction(method).staticCall(...(args.map((arg: any) => arg.value)))); } - async sendTransaction(chain: number, contractAddr: string, method: string, args: any[], outputTypes: string[], value?: bigint, waitForConfirmation: boolean = true, listener?: ITransactionListener, errorAbi: any[] = []){ + async sendTransaction(chain: number, contractAddr: string, method: string, args: any[], outputTypes: string[], txOverrides?: Overrides, value?: bigint, waitForConfirmation: boolean = true, listener?: ITransactionListener, errorAbi: any[] = []){ console.log("Send ethereum transaction. chain " + chain + "; contract " + contractAddr + "; method " + method + "; value " + value + "; args", args); @@ -74,10 +74,10 @@ export class EthersAdapter implements IWalletAdapter { const contract = await this.getEthersContractInstance(chain, contractAddr, method, args, outputTypes, value ? "payable" : "nonpayable", errorAbi); - const overrides: Overrides = { + const overrides = { + ...txOverrides, chainId: chain - }; - + } if (value) overrides.value = value; diff --git a/javascript/engine-js/src/wallet/IWalletAdapter.ts b/javascript/engine-js/src/wallet/IWalletAdapter.ts index 1b66b47..3c49765 100644 --- a/javascript/engine-js/src/wallet/IWalletAdapter.ts +++ b/javascript/engine-js/src/wallet/IWalletAdapter.ts @@ -1,4 +1,4 @@ -import {EventLog, Log} from "ethers"; +import {EventLog, Log, Overrides} from "ethers"; import {ITransactionListener} from "../ITokenScript"; import {IChainConfig} from "./EthersAdapter"; @@ -43,6 +43,7 @@ export interface IWalletAdapter { method: string, args: any[], outputTypes: string[], + txOverrides?: Overrides, value?: bigint, waitForConfirmation?: boolean, listener?: ITransactionListener, diff --git a/javascript/tokenscript-viewer/src/components/viewers/joyid-token/transfer-dialog.tsx b/javascript/tokenscript-viewer/src/components/viewers/joyid-token/transfer-dialog.tsx index 1035413..2ac3a1d 100644 --- a/javascript/tokenscript-viewer/src/components/viewers/joyid-token/transfer-dialog.tsx +++ b/javascript/tokenscript-viewer/src/components/viewers/joyid-token/transfer-dialog.tsx @@ -107,6 +107,7 @@ export class TransferDialog { args, [], null, + null, true, async (data: ITransactionStatus) => {