@0xtemple/client
Version:
Tookit for interacting with vara eps framework
1 lines • 52.5 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts","../src/libs/varaAccountManager/keypair.ts","../src/libs/varaAccountManager/crypto.ts","../src/libs/varaAccountManager/index.ts","../src/libs/varaInteractor/varaInteractor.ts","../src/libs/varaInteractor/util.ts","../src/types/index.ts","../src/libs/varaInteractor/defaultConfig.ts","../src/temples.ts","../src/utils/index.ts"],"sourcesContent":["// export * from '@mysten/sui.js/client';\n// export * from '@mysten/sui.js/utils';\n// export * from '@mysten/sui.js/transactions';\n// export { Ed25519Keypair } from '@mysten/sui.js/keypairs/ed25519';\n// export { BCS, getSuiMoveConfig } from '@mysten/bcs';\nexport * from '@gear-js/api';\nexport { Temples } from './temples';\nexport { VaraAccountManager } from './libs/varaAccountManager';\n// export { SuiContractFactory } from './libs/suiContractFactory';\n// export { loadMetadata } from './metadata';\nexport * from './types';\n","import { GearKeyring } from '@gear-js/api';\nimport { KeyringPair } from '@polkadot/keyring/types';\nimport type { DerivePathParams } from '../../types';\n\n/**\n * @description Get ed25519 derive path for Vara\n * @param derivePathParams\n */\nexport const getDerivePathForVARA = (\n derivePathParams: DerivePathParams = {}\n) => {\n const {\n accountIndex = 0,\n isExternal = false,\n addressIndex = 0,\n } = derivePathParams;\n return `m/44'/913'/${accountIndex}'/${isExternal ? 1 : 0}'/${addressIndex}'`;\n};\n\nexport function createAccount(seed: string): Promise<KeyringPair> {\n if (seed.startsWith('//')) {\n return GearKeyring.fromSuri(seed);\n }\n if (seed.startsWith('0x')) {\n return GearKeyring.fromSeed(seed);\n }\n\n return GearKeyring.fromMnemonic(seed);\n}\n","import { generateMnemonic as genMnemonic } from '@scure/bip39';\nimport { wordlist } from '@scure/bip39/wordlists/english';\n\nexport const generateMnemonic = (numberOfWords: 12 | 24 = 24) => {\n const strength = numberOfWords === 12 ? 128 : 256;\n return genMnemonic(wordlist, strength);\n};\n","import { GearKeyring } from '@gear-js/api';\nimport { createAccount } from './keypair';\nimport { generateMnemonic } from './crypto';\nimport type { AccountMangerParams, DerivePathParams } from '../../types';\nimport { KeyringPair } from '@polkadot/keyring/types';\n\nexport class VaraAccountManager {\n private mnemonics: string;\n private secretKey: string;\n public currentKeyPair: Promise<KeyringPair>;\n // public currentAddress!: string;\n\n /**\n * Support the following ways to init the VaraToolkit:\n * 1. mnemonics\n * 2. secretKey (base64 or hex)\n * If none of them is provided, will generate a random mnemonics with 24 words.\n *\n * @param mnemonics, 12 or 24 mnemonics words, separated by space\n * @param secretKey, base64 or hex string, when mnemonics is provided, secretKey will be ignored\n */\n constructor({ mnemonics, secretKey }: AccountMangerParams = {}) {\n // If the mnemonics or secretKey is provided, use it\n // Otherwise, generate a random mnemonics with 24 words\n this.mnemonics = mnemonics || '';\n this.secretKey = secretKey || '';\n if (!this.mnemonics && !this.secretKey) {\n this.mnemonics = generateMnemonic(24);\n }\n\n // Init the current account\n this.currentKeyPair = this.secretKey\n ? createAccount(this.secretKey)\n : createAccount(this.mnemonics);\n // Wait for the promise to resolve and then set the currentAddress\n // this.currentKeyPair.then((keyPair: KeyringPair) => {\n // this.currentAddress = keyPair.address;\n // });\n }\n\n getKeyPair() {\n if (!this.mnemonics) return this.currentKeyPair;\n return createAccount(this.mnemonics);\n }\n\n async getAddress() {\n if (!this.mnemonics) return (await this.currentKeyPair).address;\n return (await createAccount(this.mnemonics)).address;\n }\n\n /**\n * Switch the current account with the given derivePathParams.\n * This is only useful when the mnemonics is provided. For secretKey mode, it will always use the same account.\n */\n switchAccount() {\n if (this.mnemonics) {\n this.currentKeyPair = createAccount(this.mnemonics);\n // this.currentKeyPair.then((keyPair: KeyringPair) => {\n // this.currentAddress = keyPair.address;\n // });\n }\n }\n}\n","import {\n GearApi,\n MessageSendOptions,\n PayloadType,\n HexString,\n GearKeyring,\n decodeAddress,\n} from '@gear-js/api';\nimport { blake2AsHex } from '@polkadot/util-crypto';\n// import { SubmittableExtrinsic } from '@polkadot/api/types';\nimport type { SubmittableExtrinsic } from '@polkadot/api/submittable/types';\nimport { ISubmittableResult } from '@polkadot/types/types';\nimport { FaucetNetworkType, Network, NodeUrlType } from '../../types';\n// import { SuiOwnedObject, SuiSharedObject } from '../suiModel';\nimport { delay } from './util';\nimport { Keyring } from '@polkadot/keyring';\nimport { ProgramMetadata, GearProgram } from '@gear-js/api';\nimport { ApiPromise, WsProvider, HttpProvider } from '@polkadot/api';\nimport { metadata } from '@polkadot/types/interfaces/essentials';\nimport { KeyringPair } from '@polkadot/keyring/types';\n\nfunction hexToBinary(hex: string): string {\n let binaryString = '';\n for (let i = 0; i < hex.length; i++) {\n const bin = parseInt(hex[i], 16).toString(2).padStart(4, '0');\n binaryString += bin;\n }\n return binaryString;\n}\n\n/**\n * `SuiTransactionSender` is used to send transaction with a given gas coin.\n * It always uses the gas coin to pay for the gas,\n * and update the gas coin after the transaction.\n */\nexport class VaraInteractor {\n public readonly clients: GearApi[];\n public currentClient: GearApi;\n public readonly fullNodes: NodeUrlType[];\n public currentFullNode: NodeUrlType;\n\n public readonly wsProviders?: WsProvider[];\n public wsProvider?: WsProvider;\n public wsApi?: Promise<ApiPromise>;\n public network?: Network;\n\n constructor(\n fullNodeUrls: NodeUrlType[],\n network?: Network,\n connectWs?: boolean\n ) {\n if (fullNodeUrls.length === 0)\n throw new Error('fullNodeUrls must not be empty');\n this.fullNodes = fullNodeUrls;\n\n if (connectWs === true) {\n // this.wsProviders = fullNodeUrls.map(\n // (providerAddress) => new WsProvider(providerAddress.ws)\n // );\n // this.wsProvider = this.wsProviders[0];\n // this.wsApi = ApiPromise.create({ provider: this.wsProvider });\n this.clients = fullNodeUrls.map((fullNodeUrl) => {\n return new GearApi({\n providerAddress: fullNodeUrl.ws,\n noInitWarn: true,\n });\n });\n } else {\n this.clients = fullNodeUrls.map((fullNodeUrl) => {\n const httpProvider = new HttpProvider(fullNodeUrl.http);\n return new GearApi({ provider: httpProvider, noInitWarn: true });\n });\n }\n\n this.currentFullNode = fullNodeUrls[0];\n this.currentClient = this.clients[0];\n\n this.network = network;\n }\n\n async nodeInfo() {\n for (const clientIdx in this.clients) {\n try {\n const chain = await this.clients[clientIdx].chain();\n const nodeName = await this.clients[clientIdx].nodeName();\n const nodeVersion = await this.clients[clientIdx].nodeVersion();\n // const genesis = this.clients[clientIdx].genesisHash.toHex();\n\n return {\n chain,\n nodeName,\n nodeVersion,\n };\n } catch (err) {\n console.warn(\n `Failed to query node info with fullnode ${this.fullNodes[clientIdx]}: ${err}`\n );\n await delay(2000);\n }\n }\n throw new Error('Failed to send transaction with all fullnodes');\n }\n\n switchToNextClient() {\n const currentClientIdx = this.clients.indexOf(this.currentClient);\n this.currentClient =\n this.clients[(currentClientIdx + 1) % this.clients.length];\n this.currentFullNode =\n this.fullNodes[(currentClientIdx + 1) % this.clients.length];\n }\n\n async signAndSend(\n signer: KeyringPair,\n // programId: HexString,\n tx: SubmittableExtrinsic\n ) {\n for (const clientIdx in this.clients) {\n try {\n return await tx.signAndSend(signer, (event: any) => {\n console.log(event.toHuman());\n });\n } catch (err) {\n console.warn(\n `Failed to send transaction with fullnode ${this.fullNodes[clientIdx]}: ${err}`\n );\n await delay(2000);\n }\n }\n throw new Error('Failed to send transaction with all fullnodes');\n }\n\n async structuredTransaction(\n signer: KeyringPair,\n programId: string,\n payload: PayloadType,\n metadata: string,\n gasLimit?: number,\n value?: number\n ) {\n for (const clientIdx in this.clients) {\n try {\n await delay(1500);\n\n const meta = ProgramMetadata.from(\n metadata\n // '00020000010000000001070000000100000000000000000109000000010a000000d5072c000c34656e67696e655f736368656d611c73746f726167652c536368656d614576656e7400010c245365745265636f72640c0004011c4163746f724964000010011c5665633c75383e000010011c5665633c75383e0000003044656c6574655265636f7264080004011c4163746f724964000010011c5665633c75383e000100205265676973746572040014015c5665633c284163746f7249642c205665633c75383e293e000200000410106773746418636f6d6d6f6e287072696d6974697665731c4163746f724964000004000801205b75383b2033325d000008000003200000000c000c0000050300100000020c0014000002180018000004080410001c0838656e67696e655f73797374656d733053797374656d416374696f6e0001080c41646400000038536574456e746974794c6576656c08002001107531323800002001107531323800010000200000050700240838656e67696e655f73797374656d731c5374617465496e000108404765744c6576656c4279456e746974790400200110753132380000004447657443757272656e74436f756e74657200010000280838656e67696e655f73797374656d732053746174654f75740001083843757272656e74436f756e746572040020011075313238000000344c6576656c4279456e7469747904002001107531323800010000'\n );\n\n if (gasLimit === undefined) {\n const gas = await this.clients[clientIdx].program.calculateGas.handle(\n decodeAddress(signer.address),\n programId as HexString,\n payload,\n value,\n true,\n meta\n );\n gasLimit = gas.min_limit;\n }\n if (value === undefined) {\n value = 10000000000000;\n }\n\n const tx = await this.clients[clientIdx].message.send(\n {\n destination: programId as HexString,\n payload,\n gasLimit: gasLimit,\n value: value,\n },\n meta\n );\n\n return tx;\n } catch (err) {\n console.warn(\n `Failed to structured transaction with fullnode ${this.fullNodes[clientIdx]}: ${err}`\n );\n await delay(2000);\n }\n }\n throw new Error('Failed to structured transaction with all fullnodes');\n }\n\n async getMetaHash(programId: HexString) {\n for (const clientIdx in this.clients) {\n try {\n await delay(1500);\n const metaHash = await this.clients[clientIdx].program.metaHash(\n programId\n );\n return metaHash;\n } catch (err) {\n console.warn(\n `Failed to get metaHash with fullnode ${this.fullNodes[clientIdx]}: ${err}`\n );\n await delay(2000);\n }\n }\n throw new Error('Failed to get metaHash with all fullnodes');\n }\n\n async queryState(programId: string, payload: PayloadType, metadata: string) {\n for (const clientIdx in this.clients) {\n try {\n await delay(1500);\n\n const meta = ProgramMetadata.from(\n metadata\n // '00020000010000000001070000000100000000000000000109000000010a000000d5072c000c34656e67696e655f736368656d611c73746f726167652c536368656d614576656e7400010c245365745265636f72640c0004011c4163746f724964000010011c5665633c75383e000010011c5665633c75383e0000003044656c6574655265636f7264080004011c4163746f724964000010011c5665633c75383e000100205265676973746572040014015c5665633c284163746f7249642c205665633c75383e293e000200000410106773746418636f6d6d6f6e287072696d6974697665731c4163746f724964000004000801205b75383b2033325d000008000003200000000c000c0000050300100000020c0014000002180018000004080410001c0838656e67696e655f73797374656d733053797374656d416374696f6e0001080c41646400000038536574456e746974794c6576656c08002001107531323800002001107531323800010000200000050700240838656e67696e655f73797374656d731c5374617465496e000108404765744c6576656c4279456e746974790400200110753132380000004447657443757272656e74436f756e74657200010000280838656e67696e655f73797374656d732053746174654f75740001083843757272656e74436f756e746572040020011075313238000000344c6576656c4279456e7469747904002001107531323800010000'\n );\n // console.log(meta.getAllTypes());\n const state = await this.clients[clientIdx].programState.read(\n {\n programId: programId as HexString,\n payload,\n // payload: {\n // GetCurrentCounter: null,\n // },\n },\n meta\n );\n return state.toHuman();\n } catch (err) {\n console.warn(\n `Failed to get metaHash with fullnode ${this.fullNodes[clientIdx]}: ${err}`\n );\n await delay(2000);\n }\n }\n throw new Error('Failed to get metaHash with all fullnodes');\n }\n\n async queryBalance(addr: String) {\n for (const clientIdx in this.clients) {\n try {\n let balances_amount = await this.clients[\n clientIdx\n ].query.system.account(addr);\n return balances_amount.toHuman();\n } catch (err) {\n console.warn(\n `Failed to query(${addr}) balance with fullnode ${this.fullNodes[clientIdx]}: ${err}`\n );\n await delay(2000);\n }\n }\n throw new Error(`Failed to query(${addr}) balance with all fullnodes`);\n }\n // async getObjects(\n // ids: string[],\n // options?: SuiObjectDataOptions\n // ): Promise<SuiObjectData[]> {\n // const opts: SuiObjectDataOptions = options ?? {\n // showContent: true,\n // showDisplay: true,\n // showType: true,\n // showOwner: true,\n // };\n\n // for (const clientIdx in this.clients) {\n // try {\n // const objects = await this.clients[clientIdx].multiGetObjects({\n // ids,\n // options: opts,\n // });\n // const parsedObjects = objects\n // .map((object) => {\n // return object.data;\n // })\n // .filter((object) => object !== null && object !== undefined);\n // return parsedObjects as SuiObjectData[];\n // } catch (err) {\n // await delay(2000);\n // console.warn(\n // `Failed to get objects with fullnode ${this.fullNodes[clientIdx]}: ${err}`\n // );\n // }\n // }\n // throw new Error('Failed to get objects with all fullnodes');\n // }\n\n // async getObject(id: string) {\n // const objects = await this.getObjects([id]);\n // return objects[0];\n // }\n\n // async getDynamicFieldObject(\n // parentId: string,\n // name: RpcTypes.DynamicFieldName\n // ) {\n // for (const clientIdx in this.clients) {\n // try {\n // return await this.clients[clientIdx].getDynamicFieldObject({\n // parentId,\n // name,\n // });\n // } catch (err) {\n // await delay(2000);\n // console.warn(\n // `Failed to get DynamicFieldObject with fullnode ${this.fullNodes[clientIdx]}: ${err}`\n // );\n // }\n // }\n // throw new Error('Failed to get DynamicFieldObject with all fullnodes');\n // }\n\n // async getDynamicFields(parentId: string, cursor?: string, limit?: number) {\n // for (const clientIdx in this.clients) {\n // try {\n // return await this.clients[clientIdx].getDynamicFields({\n // parentId,\n // cursor,\n // limit,\n // });\n // } catch (err) {\n // await delay(2000);\n // console.warn(\n // `Failed to get DynamicFields with fullnode ${this.fullNodes[clientIdx]}: ${err}`\n // );\n // }\n // }\n // throw new Error('Failed to get DynamicFields with all fullnodes');\n // }\n\n // async getTxDetails(digest: string) {\n // for (const clientIdx in this.clients) {\n // try {\n // const txResOptions: SuiTransactionBlockResponseOptions = {\n // showEvents: true,\n // showEffects: true,\n // showObjectChanges: true,\n // showBalanceChanges: true,\n // };\n\n // return await this.clients[clientIdx].getTransactionBlock({\n // digest,\n // options: txResOptions,\n // });\n // } catch (err) {\n // await delay(2000);\n // console.warn(\n // `Failed to get TransactionBlocks with fullnode ${this.fullNodes[clientIdx]}: ${err}`\n // );\n // }\n // }\n // throw new Error('Failed to get TransactionBlocks with all fullnodes');\n // }\n\n // async getOwnedObjects(owner: string, cursor?: string, limit?: number) {\n // for (const clientIdx in this.clients) {\n // try {\n // return await this.clients[clientIdx].getOwnedObjects({\n // owner,\n // cursor,\n // limit,\n // });\n // } catch (err) {\n // await delay(2000);\n // console.warn(\n // `Failed to get OwnedObjects with fullnode ${this.fullNodes[clientIdx]}: ${err}`\n // );\n // }\n // }\n // throw new Error('Failed to get OwnedObjects with all fullnodes');\n // }\n\n // async getNormalizedMoveModulesByPackage(packageId: string) {\n // for (const clientIdx in this.clients) {\n // try {\n // return await this.clients[clientIdx].getNormalizedMoveModulesByPackage({\n // package: packageId,\n // });\n // } catch (err) {\n // await delay(2000);\n // console.warn(\n // `Failed to get NormalizedMoveModules with fullnode ${this.fullNodes[clientIdx]}: ${err}`\n // );\n // }\n // }\n // throw new Error('Failed to get NormalizedMoveModules with all fullnodes');\n // }\n\n // /**\n // * @description Update objects in a batch\n // * @param suiObjects\n // */\n // async updateObjects(suiObjects: (SuiOwnedObject | SuiSharedObject)[]) {\n // const objectIds = suiObjects.map((obj) => obj.objectId);\n // const objects = await this.getObjects(objectIds);\n // for (const object of objects) {\n // const suiObject = suiObjects.find(\n // (obj) => obj.objectId === object?.objectId\n // );\n // if (suiObject instanceof SuiSharedObject) {\n // if (\n // object.owner &&\n // typeof object.owner === 'object' &&\n // 'Shared' in object.owner\n // ) {\n // suiObject.initialSharedVersion =\n // object.owner.Shared.initial_shared_version;\n // } else {\n // suiObject.initialSharedVersion = undefined;\n // }\n // } else if (suiObject instanceof SuiOwnedObject) {\n // suiObject.version = object?.version;\n // suiObject.digest = object?.digest;\n // }\n // }\n // }\n\n // /**\n // * @description Select coins that add up to the given amount.\n // * @param addr the address of the owner\n // * @param amount the amount that is needed for the coin\n // * @param coinType the coin type, default is '0x2::SUI::SUI'\n // */\n // async selectCoins(\n // addr: string,\n // amount: number,\n // coinType: string = '0x2::SUI::SUI'\n // ) {\n // const selectedCoins: {\n // objectId: string;\n // digest: string;\n // version: string;\n // }[] = [];\n // let totalAmount = 0;\n // let hasNext = true,\n // nextCursor: string | null | undefined = null;\n // while (hasNext && totalAmount < amount) {\n // const coins = await this.currentClient.getCoins({\n // owner: addr,\n // coinType: coinType,\n // cursor: nextCursor,\n // });\n // // Sort the coins by balance in descending order\n // coins.data.sort((a, b) => parseInt(b.balance) - parseInt(a.balance));\n // for (const coinData of coins.data) {\n // selectedCoins.push({\n // objectId: coinData.coinObjectId,\n // digest: coinData.digest,\n // version: coinData.version,\n // });\n // totalAmount = totalAmount + parseInt(coinData.balance);\n // if (totalAmount >= amount) {\n // break;\n // }\n // }\n\n // nextCursor = coins.nextCursor;\n // hasNext = coins.hasNextPage;\n // }\n\n // if (!selectedCoins.length) {\n // throw new Error('No valid coins found for the transaction.');\n // }\n // return selectedCoins;\n // }\n\n // async requestFaucet(address: string, network: FaucetNetworkType) {\n // await requestSuiFromFaucetV0({\n // host: getFaucetHost(network),\n // recipient: address,\n // });\n // }\n}\n","export const delay = (ms: number) =>\n new Promise((resolve) => setTimeout(resolve, ms));\n","import { ProgramMetadata } from '@gear-js/api';\nimport type { SubmittableExtrinsic } from '@polkadot/api/submittable/types';\n\n// import { SuiMoveMoudleFuncType } from '../libs/suiContractFactory/types';\n\n// export type TempleObjectData = {\n// objectId: string;\n// objectType: string;\n// objectVersion: number;\n// objectDisplay: DisplayFieldsResponse;\n// objectFields: ObjectContentFields;\n// };\n\n// export type TempleObjectContent = {\n// dataType: 'moveObject';\n// fields: MoveStruct;\n// hasPublicTransfer: boolean;\n// type: string;\n// };\n\nexport type NodeUrlType = {\n ws: string;\n http: string;\n};\n\nexport type TemplesParams = {\n mnemonics?: string;\n secretKey?: string;\n fullnodeUrls?: NodeUrlType[];\n networkType?: Network;\n packageId?: string;\n metadata?: string;\n connectWs?: boolean;\n};\n\nexport type SchemaFieldType = {\n schemas: {\n type: string;\n fields: {\n id: {\n id: string;\n };\n size: string;\n };\n };\n};\n\nexport type SchemaValueType = {\n id: {\n id: string;\n };\n name: string;\n value: {\n type: string;\n fields: SchemaFieldType;\n };\n};\n\nexport type SchemaContentType = {\n type: string;\n fields: SchemaValueType;\n hasPublicTransfer: boolean;\n dataType: 'moveObject';\n};\n\nexport type VaraFuncType = {\n funcName: string;\n paramType: string;\n};\n\nexport interface MessageMeta {\n readonly meta: VaraFuncType;\n}\n\nexport interface ContractTx extends MessageMeta {\n (params?: unknown[] | null, isRaw?: boolean): SubmittableExtrinsic;\n}\n\nexport interface ContractQuery extends MessageMeta {\n (params?: unknown[] | null): any;\n}\n\nexport type MapMessageTx = Record<string, ContractTx>;\nexport type MapMessageQuery = Record<string, ContractQuery>;\n\nexport type MapMoudleFuncTx = Record<string, MapMessageTx>;\nexport type MapMoudleFuncQuery = Record<string, MapMessageQuery>;\n\n// export type MapMoudleFuncTest = Record<string, Record<string, string>>;\n// export type MapMoudleFuncQueryTest = Record<string, Record<string, string>>;\n\nexport type AccountMangerParams = {\n mnemonics?: string;\n secretKey?: string;\n};\n\nexport type DerivePathParams = {\n accountIndex?: number;\n isExternal?: boolean;\n addressIndex?: number;\n};\n\n// export type NetworkType = 'testnet' | 'mainnet' | 'devnet' | 'localnet';\nexport enum Network {\n MAINNET = 'mainnet',\n TESTNET = 'testnet',\n LOCAL = 'local',\n}\nexport type FaucetNetworkType = 'testnet' | 'devnet' | 'localnet';\n\nexport type PureCallArg = {\n Pure: number[];\n};\n\n/**\n * These are the basics types that can be used in the SUI\n */\nexport type VaraBasicTypes =\n | 'address'\n | 'bool'\n | 'u8'\n | 'u16'\n | 'u32'\n | 'u64'\n | 'u128'\n | 'u256'\n | 'signer';\n\nexport type VaraInputTypes = 'object' | VaraBasicTypes;\n\nexport type DynamicFieldContentType = {\n type: string;\n fields: Record<string, any>;\n hasPublicTransfer: boolean;\n dataType: string;\n};\n\nexport type ObjectContent = {\n type: string;\n fields: Record<string, any>;\n hasPublicTransfer: boolean;\n dataType: string;\n};\n","import { Network } from '../../types';\n\n/**\n * @description Get the default fullnode and faucet url for the given network type\n * @param networkType, 'testnet' | 'mainnet' | 'localnet', default is 'testnet'\n * @returns { fullNode: string, faucet?: string }\n */\nexport const getDefaultURL = (networkType: Network = Network.TESTNET) => {\n switch (networkType) {\n case Network.LOCAL:\n return {\n ws: 'ws://127.0.0.1:9944',\n http: 'http://127.0.0.1:9933',\n };\n case Network.TESTNET:\n return {\n ws: 'wss://testnet.vara.network',\n http: 'https://testnet.vara.network',\n };\n case Network.MAINNET:\n return {\n ws: 'wss://rpc.vara.network',\n http: 'https://rpc.vara.network',\n };\n default:\n return {\n ws: 'wss://testnet.vara.network',\n http: 'https://testnet.vara.network',\n };\n }\n};\n","// import { RawSigner, SuiAddress } from '@mysten/sui.js';\n\nimport { VaraAccountManager } from './libs/varaAccountManager';\nimport { VaraInteractor, getDefaultURL } from './libs/varaInteractor';\nimport type { SubmittableExtrinsic } from '@polkadot/api/submittable/types';\n\nimport {\n ContractQuery,\n ContractTx,\n MapMessageQuery,\n MapMessageTx,\n MapMoudleFuncQuery,\n MapMoudleFuncTx,\n TemplesParams,\n // SuiTxArgument,\n Network,\n VaraFuncType,\n} from './types';\nimport { GearApi, ProgramMetadata, HexString } from '@gear-js/api';\n// import { AbiMessage } from '@polkadot/api-contract/types';\nimport { normalizeHexAddress, numberToAddressHex } from './utils';\n\nexport function isUndefined(value?: unknown): value is undefined {\n return value === undefined;\n}\n\nexport function withMeta<T extends { meta: VaraFuncType }>(\n meta: VaraFuncType,\n creator: Omit<T, 'meta'>\n): T {\n (creator as T).meta = meta;\n\n return creator as T;\n}\n\nfunction createQuery(\n meta: VaraFuncType,\n fn: (params?: unknown[] | null) => any\n): ContractQuery {\n return withMeta(meta, async (params?: unknown[] | null): Promise<any> => {\n const result = await fn(params);\n return result;\n });\n}\n\nfunction createTx(\n meta: VaraFuncType,\n fn: (\n params?: unknown[] | null,\n isRaw?: boolean\n ) => Promise<SubmittableExtrinsic>\n): ContractTx {\n return withMeta(\n meta,\n async (\n params?: unknown[] | null,\n isRaw?: boolean\n ): Promise<SubmittableExtrinsic> => {\n return await fn(params, isRaw);\n }\n );\n}\n\n/**\n * @class Temples\n * @description This class is used to aggregate the tools that used to interact with SUI network.\n */\nexport class Temples {\n public accountManager: VaraAccountManager;\n public varaInteractor: VaraInteractor;\n public packageId: string | undefined;\n public metadata: string | undefined;\n\n readonly #query: MapMoudleFuncQuery = {};\n readonly #tx: MapMoudleFuncTx = {};\n /**\n * Support the following ways to init the TempleClient:\n * 1. mnemonics\n * 2. secretKey (base64 or hex)\n * If none of them is provided, will generate a random mnemonics with 24 words.\n *\n * @param mnemonics, 12 or 24 mnemonics words, separated by space\n * @param secretKey, base64 or hex string, when mnemonics is provided, secretKey will be ignored\n * @param networkType, 'testnet' | 'mainnet' | 'devnet' | 'localnet', default is 'devnet'\n * @param fullnodeUrl, the fullnode url, default is the preconfig fullnode url for the given network type\n * @param packageId\n */\n constructor({\n mnemonics,\n secretKey,\n networkType,\n fullnodeUrls,\n packageId,\n metadata,\n connectWs,\n }: TemplesParams = {}) {\n // Init the account manager\n this.accountManager = new VaraAccountManager({ mnemonics, secretKey });\n // Init the rpc provider\n fullnodeUrls = fullnodeUrls || [\n getDefaultURL(networkType ?? Network.MAINNET),\n ];\n this.varaInteractor = new VaraInteractor(\n fullnodeUrls,\n networkType,\n connectWs\n );\n\n this.packageId = packageId;\n if (metadata !== undefined) {\n this.metadata = metadata;\n const metaraw = ProgramMetadata.from(metadata);\n const allTypes = metaraw.getAllTypes();\n try {\n const stateInRegex = /StateQuery$/;\n const systemActionRegex = /SystemAction$/;\n for (const [key, value] of Object.entries(allTypes)) {\n let execEnumObj = null;\n if (systemActionRegex.test(key)) {\n if (value !== 'Null') {\n execEnumObj = JSON.parse(value as string)._enum;\n }\n }\n\n let queryEnumObj = null;\n if (stateInRegex.test(key)) {\n if (value !== 'Null') {\n queryEnumObj = JSON.parse(value as string)._enum;\n }\n }\n\n // const execMethodTypes = allTypes['EngineSystemsSystemAction'];\n // for (const [key, value] of Object.entries(queryMethodTypes)) {\n // const execEnumObj = JSON.parse(execMethodTypes as string)._enum;\n\n // const queryMethodTypes = allTypes['EngineSystemsStateIn'];\n // const queryEnumObj = JSON.parse(queryMethodTypes as string)._enum;\n // console.log(execEnumObj);\n // console.log(queryEnumObj);\n if (execEnumObj !== null) {\n for (const [funcName, enumValue] of Object.entries(execEnumObj)) {\n const meta = {\n funcName,\n paramType: enumValue,\n } as VaraFuncType;\n if (isUndefined(this.#tx['contract'])) {\n this.#tx['contract'] = {};\n }\n if (isUndefined(this.#tx['contract'][funcName])) {\n console.log('exec func: ', funcName);\n this.#tx['contract'][funcName] = createTx(meta, (p, isRaw) =>\n this.#exec(meta, p, isRaw)\n );\n }\n }\n }\n if (queryEnumObj !== null) {\n for (const [funcName, enumValue] of Object.entries(queryEnumObj)) {\n const meta = {\n funcName,\n paramType: enumValue,\n } as VaraFuncType;\n if (isUndefined(this.#query['contract'])) {\n this.#query['contract'] = {};\n }\n if (isUndefined(this.#query['contract'][funcName])) {\n console.log('query func: ', funcName);\n this.#query['contract'][funcName] = createQuery(meta, (p) =>\n this.#read(meta, p)\n );\n }\n }\n }\n }\n } catch {}\n }\n }\n\n public get query(): MapMoudleFuncQuery {\n return this.#query;\n }\n\n public get tx(): MapMoudleFuncTx {\n return this.#tx;\n }\n\n #exec = async (\n meta: VaraFuncType,\n params?: unknown[] | null,\n isRaw?: boolean\n ) => {\n if (params === undefined) {\n params = null;\n }\n const payload = {\n [meta.funcName]: params,\n };\n const account = await this.accountManager.getKeyPair();\n const tx = await this.varaInteractor.structuredTransaction(\n account,\n this.packageId!,\n payload,\n this.metadata!\n );\n if (isRaw === true) {\n return tx;\n }\n return await this.varaInteractor.signAndSend(account, tx);\n };\n\n #read = async (meta: VaraFuncType, params?: unknown[] | null) => {\n if (params === undefined) {\n params = null;\n }\n const payload = {\n [meta.funcName]: params,\n };\n let state = await this.varaInteractor.queryState(\n this.packageId!,\n payload,\n this.metadata!\n );\n return state;\n };\n\n /**\n * if derivePathParams is not provided or mnemonics is empty, it will return the keypair.\n * else:\n * it will generate signer from the mnemonic with the given derivePathParams.\n * @param derivePathParams, such as { accountIndex: 2, isExternal: false, addressIndex: 10 }, comply with the BIP44 standard\n */\n getKeypair() {\n return this.accountManager.getKeyPair();\n }\n\n /**\n * @description Switch the current account with the given derivePathParams\n * @param derivePathParams, such as { accountIndex: 2, isExternal: false, addressIndex: 10 }, comply with the BIP44 standard\n */\n switchAccount() {\n this.accountManager.switchAccount();\n }\n\n /**\n * @description Get the address of the account for the given derivePathParams\n * @param derivePathParams, such as { accountIndex: 2, isExternal: false, addressIndex: 10 }, comply with the BIP44 standard\n */\n getAddress() {\n return this.accountManager.getAddress();\n }\n\n async currentAddress() {\n return await this.accountManager.getAddress();\n }\n\n getPackageId() {\n return this.packageId;\n }\n\n async getMetaHash(programId: HexString) {\n return await this.varaInteractor.getMetaHash(programId);\n }\n\n getMetadata() {\n return this.metadata;\n }\n\n getAllTypes(metadata?: string) {\n if (metadata === undefined) {\n metadata = this.metadata!;\n }\n const metaraw = ProgramMetadata.from(metadata);\n const allTypes = metaraw.getAllTypes();\n return allTypes;\n }\n\n async getBalance(account?: String) {\n if (account === undefined) {\n account = await this.accountManager.getAddress();\n }\n return await this.varaInteractor.queryBalance(account);\n }\n\n client() {\n return this.varaInteractor.currentClient;\n }\n\n wsProvider() {\n return this.varaInteractor.wsApi;\n }\n\n // async signTxn(\n // tx: Uint8Array | TransactionBlock | SuiTxBlock,\n // derivePathParams?: DerivePathParams\n // ) {\n // if (tx instanceof SuiTxBlock || tx instanceof TransactionBlock) {\n // tx.setSender(this.getAddress(derivePathParams));\n // }\n // const txBlock = tx instanceof SuiTxBlock ? tx.txBlock : tx;\n // const txBytes =\n // txBlock instanceof TransactionBlock\n // ? await txBlock.build({ client: this.client() })\n // : txBlock;\n // const keyPair = await this.getKeypair();\n // return await keyPair.signTransactionBlock(txBytes);\n // }\n\n // async signAndSend(\n // signer: Keyring,\n // programId: HexString,\n // metaHash: HexString,\n // payload: PayloadType,\n // gasLimit: number | undefined,\n // value: number | undefined\n\n // async signAndSendTxn(\n // tx: Uint8Array | TransactionBlock | SuiTxBlock,\n // derivePathParams?: DerivePathParams\n // ): Promise<SuiTransactionBlockResponse> {\n // const { bytes, signature } = await this.signTxn(tx, derivePathParams);\n // return this.suiInteractor.sendTx(bytes, signature);\n // }\n\n // /**\n // * Transfer the given amount of SUI to the recipient\n // * @param recipient\n // * @param amount\n // * @param derivePathParams\n // */\n // async transferVara(\n // recipient: string,\n // amount: number,\n // derivePathParams?: DerivePathParams\n // ) {\n // const tx = new SuiTxBlock();\n // tx.transferSui(recipient, amount);\n // return this.signAndSendTxn(tx, derivePathParams);\n // }\n\n // /**\n // * Transfer to mutliple recipients\n // * @param recipients the recipients addresses\n // * @param amounts the amounts of SUI to transfer to each recipient, the length of amounts should be the same as the length of recipients\n // * @param derivePathParams\n // */\n // async transferSuiToMany(\n // recipients: string[],\n // amounts: number[],\n // derivePathParams?: DerivePathParams\n // ) {\n // const tx = new SuiTxBlock();\n // tx.transferSuiToMany(recipients, amounts);\n // return this.signAndSendTxn(tx, derivePathParams);\n // }\n\n // async moveCall(callParams: {\n // target: string;\n // arguments?: (SuiTxArg | SuiVecTxArg)[];\n // typeArguments?: string[];\n // derivePathParams?: DerivePathParams;\n // }) {\n // const {\n // target,\n // arguments: args = [],\n // typeArguments = [],\n // derivePathParams,\n // } = callParams;\n // const tx = new SuiTxBlock();\n // tx.moveCall(target, args, typeArguments);\n // return this.signAndSendTxn(tx, derivePathParams);\n // }\n\n // async getWorld(worldObjectId: string) {\n // return this.suiInteractor.getObject(worldObjectId);\n // }\n\n // async listSchemaNames(worldId: string) {\n // const worldObject = await this.getObject(worldId);\n // const newObjectContent = worldObject.content;\n // if (newObjectContent != null) {\n // const objectContent = newObjectContent as TempleObjectContent;\n // const objectFields = objectContent.fields as Record<string, any>;\n // return objectFields['schema_names'];\n // } else {\n // return [];\n // }\n // }\n\n // async getEntity(\n // worldId: string,\n // schemaName: string,\n // entityId?: string\n // ): Promise<any[] | undefined> {\n // const schemaModuleName = `${schemaName}_schema`;\n // const tx = new TransactionBlock();\n // const params = [tx.pure(worldId)] as TransactionArgument[];\n\n // if (entityId !== undefined) {\n // params.push(tx.pure(entityId));\n // }\n\n // const getResult = (await this.query[schemaModuleName].get(\n // tx,\n // params\n // )) as DevInspectResults;\n // const returnValue = [];\n\n // // \"success\" | \"failure\";\n // if (getResult.effects.status.status === 'success') {\n // const resultList = getResult.results![0].returnValues!;\n // for (const res of resultList) {\n // const bcs = new BCS(getSuiMoveConfig());\n // const value = Uint8Array.from(res[0]);\n // const bcsType = res[1].replace(/0x1::ascii::String/g, 'string');\n // const data = bcs.de(bcsType, value);\n // returnValue.push(data);\n // }\n // return returnValue;\n // } else {\n // return undefined;\n // }\n // }\n\n // async containEntity(\n // worldId: string,\n // schemaName: string,\n // entityId?: string\n // ): Promise<boolean | undefined> {\n // const schemaModuleName = `${schemaName}_schema`;\n // const tx = new TransactionBlock();\n // const params = [tx.pure(worldId)] as TransactionArgument[];\n\n // if (entityId !== undefined) {\n // params.push(tx.pure(entityId));\n // }\n\n // const getResult = (await this.query[schemaModuleName].contains(\n // tx,\n // params\n // )) as DevInspectResults;\n\n // // \"success\" | \"failure\";\n // if (getResult.effects.status.status === 'success') {\n // const res = getResult.results![0].returnValues![0];\n // const bcs = new BCS(getSuiMoveConfig());\n // const value = Uint8Array.from(res[0]);\n // return bcs.de(res[1], value);\n // } else {\n // return undefined;\n // }\n // }\n\n // async getEntities(\n // worldId: string,\n // schemaName: string,\n // cursor?: string,\n // limit?: number\n // ) {\n // let schemaModuleName = `${schemaName}_schema`;\n\n // const tx = new TransactionBlock();\n // let params = [tx.pure(worldId)] as SuiTxArgument[];\n\n // const tableResult = (await this.query[schemaonentModuleName].entities(\n // tx,\n // params\n // )) as DevInspectResults;\n // const entities = tableResult.results as SuiReturnValues;\n // const bcs = new BCS(getSuiMoveConfig());\n\n // let value = Uint8Array.from(entities[0].returnValues[0][0]);\n // let tableId = '0x' + bcs.de('address', value);\n // let dynamicFields = await this.suiInteractor.getDynamicFields(\n // tableId,\n // cursor,\n // limit\n // );\n // let objectIds = dynamicFields.data.map((field) => field.objectId);\n // let objectDatas = await this.suiInteractor.getEntitiesObjects(objectIds);\n // return {\n // data: objectDatas,\n // nextCursor: dynamicFields.nextCursor,\n // hasNextPage: dynamicFields.hasNextPage,\n // };\n // }\n\n async entity_key_from_hex_string(hexString: string) {\n const checkObjectId = normalizeHexAddress(hexString);\n if (checkObjectId !== null) {\n hexString = checkObjectId;\n return hexString;\n } else {\n return undefined;\n }\n }\n\n async entity_key_from_u256(x: number) {\n return numberToAddressHex(x);\n }\n}\n","export function capitalizeFirstLetter(input: string): string {\n return input.charAt(0).toUpperCase() + input.slice(1);\n}\n\nexport function normalizeHexAddress(input: string): string | null {\n const hexRegex = /^(0x)?[0-9a-fA-F]{64}$/;\n\n if (hexRegex.test(input)) {\n if (input.startsWith('0x')) {\n return input;\n } else {\n return '0x' + input;\n }\n } else {\n return null;\n }\n}\n\nexport function numberToAddressHex(num: number): string {\n const hex = num.toString(16);\n const paddedHex = '0x' + hex.padStart(64, '0');\n return paddedHex;\n}\n"],"mappings":"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