diff --git a/src/contract/Contract.ts b/src/contract/Contract.ts index 3449f7e629..05f4553f0f 100644 --- a/src/contract/Contract.ts +++ b/src/contract/Contract.ts @@ -7,7 +7,7 @@ import { Encoder as Calldata } from '@aeternity/aepp-calldata'; import { DRY_RUN_ACCOUNT } from '../tx/builder/schema'; -import { Tag, AensName } from '../tx/builder/constants'; +import { Tag, AensName, ConsensusProtocolVersion } from '../tx/builder/constants'; import { buildContractIdByContractTx, unpackTx, buildTxAsync, BuildTxOptions, buildTxHash, } from '../tx/builder'; @@ -45,6 +45,7 @@ import { import AccountBase from '../account/Base'; import { TxUnpacked } from '../tx/builder/schema.generated'; import { isAccountNotFoundError } from '../utils/other'; +import { isNameValid, produceNameId } from '../tx/builder/helpers'; type ContractAci = NonNullable; type FunctionAci = ContractAci['functions'][0]; @@ -308,7 +309,9 @@ class Contract { ): Promise>> { const { callStatic, top, ...opt } = { ...this.$options, ...options }; const fnAci = this.#getFunctionAci(fn); - const contractId = this.$options.address; + const { address, name } = this.$options; + // TODO: call `produceNameId` on buildTx side + const contractId = name != null ? produceNameId(name) : address; const { onNode } = opt; if (fn == null) throw new MissingFunctionNameError(); @@ -485,12 +488,16 @@ class Contract { } if (aci == null) throw new MissingContractDefError(); + let name; if (address != null) { address = await resolveName( address, 'contract_pubkey', { resolveByNode: true, onNode }, ) as Encoded.ContractAddress; + const isIris = (await onNode.getNodeInfo()) + .consensusProtocolVersion === ConsensusProtocolVersion.Iris; + if (!isIris && isNameValid(address)) name = address; } if (address == null && sourceCode == null && sourceCodePath == null && bytecode == null) { @@ -527,6 +534,7 @@ class Contract { bytecode, aci, address, + name, fileSystem, ...otherOptions, }); @@ -548,6 +556,10 @@ class Contract { bytecode?: Encoded.ContractBytearray; aci: Aci; address?: Encoded.ContractAddress; + /** + * Supported only in Ceres + */ + name?: AensName; sourceCodePath?: Parameters[0]; sourceCode?: Parameters[0]; fileSystem?: Parameters[1]; diff --git a/src/tx/builder/schema.ts b/src/tx/builder/schema.ts index ac1a54f7f8..4441ab37dd 100644 --- a/src/tx/builder/schema.ts +++ b/src/tx/builder/schema.ts @@ -154,6 +154,7 @@ export const txSchema = [{ tag: shortUIntConst(Tag.SpendTx), version: shortUIntConst(1, true), senderId: address(Encoding.AccountAddress), + // TODO: accept also an AENS name recipientId: address(Encoding.AccountAddress, Encoding.Name), amount: coinAmount, fee, @@ -212,6 +213,7 @@ export const txSchema = [{ accountId: address(Encoding.AccountAddress), nonce: nonce('accountId'), nameId, + // TODO: accept also an AENS name recipientId: address(Encoding.AccountAddress, Encoding.Name), fee, ttl, @@ -258,6 +260,7 @@ export const txSchema = [{ version: shortUIntConst(1, true), callerId: address(Encoding.AccountAddress), nonce: nonce('callerId'), + // TODO: accept also an AENS name contractId: address(Encoding.ContractAddress, Encoding.Name), abiVersion, fee, @@ -306,6 +309,7 @@ export const txSchema = [{ }, { tag: shortUIntConst(Tag.OracleExtendTx), version: shortUIntConst(1, true), + // TODO: accept also an AENS name oracleId: address(Encoding.OracleAddress, Encoding.Name), nonce: nonce('oracleId'), oracleTtlType: withDefault(ORACLE_TTL_TYPES.delta, enumeration(ORACLE_TTL_TYPES)), @@ -317,6 +321,7 @@ export const txSchema = [{ version: shortUIntConst(1, true), senderId: address(Encoding.AccountAddress), nonce: nonce('senderId'), + // TODO: accept also an AENS name oracleId: address(Encoding.OracleAddress, Encoding.Name), query: string, queryFee, diff --git a/src/tx/validator.ts b/src/tx/validator.ts index ca17dc8056..113aa7cec2 100644 --- a/src/tx/validator.ts +++ b/src/tx/validator.ts @@ -176,6 +176,8 @@ validators.push( }, async (tx, { node }) => { if (Tag.ContractCallTx !== tx.tag) return []; + // TODO: remove after solving https://github.com/aeternity/aeternity/issues/3669 + if (tx.contractId.startsWith('nm_')) return []; try { const { active } = await node.getContract(tx.contractId); if (active) return []; diff --git a/test/integration/aens.ts b/test/integration/aens.ts index 1da0783e09..ef3d0db485 100644 --- a/test/integration/aens.ts +++ b/test/integration/aens.ts @@ -104,7 +104,8 @@ describe('Aens', () => { await nameObject.update({ contract_pubkey: contract.$options.address }); contract = await aeSdk.initializeContract({ sourceCode, address: name }); - expect((await contract.getArg(42)).decodedResult).to.be.equal(42n); + expect((await contract.getArg(42, { callStatic: true })).decodedResult).to.be.equal(42n); + expect((await contract.getArg(42, { callStatic: false })).decodedResult).to.be.equal(42n); }); const address = generateKeyPair().publicKey;