import * as $ from "@manahippo/move-to-ts"; import {AptosDataCache, AptosParserRepo, DummyCache, AptosLocalCache} from "@manahippo/move-to-ts"; import {U8, U64, U128} from "@manahippo/move-to-ts"; import {u8, u64, u128} from "@manahippo/move-to-ts"; import {TypeParamDeclType, FieldDeclType} from "@manahippo/move-to-ts"; import {AtomicTypeTag, StructTag, TypeTag, VectorTag, SimpleStructTag} from "@manahippo/move-to-ts"; import {OptionTransaction} from "@manahippo/move-to-ts"; import {HexString, AptosClient, AptosAccount, TxnBuilderTypes, Types} from "aptos"; import * as Coin from "./coin"; import * as Error from "./error"; import * as Signer from "./signer"; import * as String from "./string"; export const packageName = "AptosFramework"; export const moduleAddress = new HexString("0x1"); export const moduleName = "managed_coin"; export const ENO_CAPABILITIES : U64 = u64("1"); export class Capabilities { static moduleAddress = moduleAddress; static moduleName = moduleName; __app: $.AppType | null = null; static structName: string = "Capabilities"; static typeParameters: TypeParamDeclType[] = [ { name: "CoinType", isPhantom: true } ]; static fields: FieldDeclType[] = [ { name: "burn_cap", typeTag: new StructTag(new HexString("0x1"), "coin", "BurnCapability", [new $.TypeParamIdx(0)]) }, { name: "freeze_cap", typeTag: new StructTag(new HexString("0x1"), "coin", "FreezeCapability", [new $.TypeParamIdx(0)]) }, { name: "mint_cap", typeTag: new StructTag(new HexString("0x1"), "coin", "MintCapability", [new $.TypeParamIdx(0)]) }]; burn_cap: Coin.BurnCapability; freeze_cap: Coin.FreezeCapability; mint_cap: Coin.MintCapability; constructor(proto: any, public typeTag: TypeTag) { this.burn_cap = proto['burn_cap'] as Coin.BurnCapability; this.freeze_cap = proto['freeze_cap'] as Coin.FreezeCapability; this.mint_cap = proto['mint_cap'] as Coin.MintCapability; } static CapabilitiesParser(data:any, typeTag: TypeTag, repo: AptosParserRepo) : Capabilities { const proto = $.parseStructProto(data, typeTag, repo, Capabilities); return new Capabilities(proto, typeTag); } static async load(repo: AptosParserRepo, client: AptosClient, address: HexString, typeParams: TypeTag[]) { const result = await repo.loadResource(client, address, Capabilities, typeParams); return result as unknown as Capabilities; } static async loadByApp(app: $.AppType, address: HexString, typeParams: TypeTag[]) { const result = await app.repo.loadResource(app.client, address, Capabilities, typeParams); await result.loadFullState(app) return result as unknown as Capabilities; } static makeTag($p: TypeTag[]): StructTag { return new StructTag(moduleAddress, moduleName, "Capabilities", $p); } async loadFullState(app: $.AppType) { await this.burn_cap.loadFullState(app); await this.freeze_cap.loadFullState(app); await this.mint_cap.loadFullState(app); this.__app = app; } } export function burn_ ( account: HexString, amount: U64, $c: AptosDataCache, $p: TypeTag[], /* */ ): void { let account_addr, capabilities, to_burn; account_addr = Signer.address_of_(account, $c); if (!$c.exists(new SimpleStructTag(Capabilities, [$p[0]]), $.copy(account_addr))) { throw $.abortCode(Error.not_found_($.copy(ENO_CAPABILITIES), $c)); } capabilities = $c.borrow_global(new SimpleStructTag(Capabilities, [$p[0]]), $.copy(account_addr)); to_burn = Coin.withdraw_(account, $.copy(amount), $c, [$p[0]]); Coin.burn_(to_burn, capabilities.burn_cap, $c, [$p[0]]); return; } export function buildPayload_burn ( amount: U64, $p: TypeTag[], /* */ isJSON = false, ): TxnBuilderTypes.TransactionPayloadEntryFunction | Types.TransactionPayload_EntryFunctionPayload { const typeParamStrings = $p.map(t=>$.getTypeTagFullname(t)); return $.buildPayload( new HexString("0x1"), "managed_coin", "burn", typeParamStrings, [ amount, ], isJSON, ); } export function initialize_ ( account: HexString, name: U8[], symbol: U8[], decimals: U8, monitor_supply: boolean, $c: AptosDataCache, $p: TypeTag[], /* */ ): void { let burn_cap, freeze_cap, mint_cap; [burn_cap, freeze_cap, mint_cap] = Coin.initialize_(account, String.utf8_($.copy(name), $c), String.utf8_($.copy(symbol), $c), $.copy(decimals), monitor_supply, $c, [$p[0]]); $c.move_to(new SimpleStructTag(Capabilities, [$p[0]]), account, new Capabilities({ burn_cap: $.copy(burn_cap), freeze_cap: $.copy(freeze_cap), mint_cap: $.copy(mint_cap) }, new SimpleStructTag(Capabilities, [$p[0]]))); return; } export function buildPayload_initialize ( name: U8[], symbol: U8[], decimals: U8, monitor_supply: boolean, $p: TypeTag[], /* */ isJSON = false, ): TxnBuilderTypes.TransactionPayloadEntryFunction | Types.TransactionPayload_EntryFunctionPayload { const typeParamStrings = $p.map(t=>$.getTypeTagFullname(t)); return $.buildPayload( new HexString("0x1"), "managed_coin", "initialize", typeParamStrings, [ name, symbol, decimals, monitor_supply, ], isJSON, ); } export function mint_ ( account: HexString, dst_addr: HexString, amount: U64, $c: AptosDataCache, $p: TypeTag[], /* */ ): void { let account_addr, capabilities, coins_minted; account_addr = Signer.address_of_(account, $c); if (!$c.exists(new SimpleStructTag(Capabilities, [$p[0]]), $.copy(account_addr))) { throw $.abortCode(Error.not_found_($.copy(ENO_CAPABILITIES), $c)); } capabilities = $c.borrow_global(new SimpleStructTag(Capabilities, [$p[0]]), $.copy(account_addr)); coins_minted = Coin.mint_($.copy(amount), capabilities.mint_cap, $c, [$p[0]]); Coin.deposit_($.copy(dst_addr), coins_minted, $c, [$p[0]]); return; } export function buildPayload_mint ( dst_addr: HexString, amount: U64, $p: TypeTag[], /* */ isJSON = false, ): TxnBuilderTypes.TransactionPayloadEntryFunction | Types.TransactionPayload_EntryFunctionPayload { const typeParamStrings = $p.map(t=>$.getTypeTagFullname(t)); return $.buildPayload( new HexString("0x1"), "managed_coin", "mint", typeParamStrings, [ dst_addr, amount, ], isJSON, ); } export function register_ ( account: HexString, $c: AptosDataCache, $p: TypeTag[], /* */ ): void { Coin.register_(account, $c, [$p[0]]); return; } export function buildPayload_register ( $p: TypeTag[], /* */ isJSON = false, ): TxnBuilderTypes.TransactionPayloadEntryFunction | Types.TransactionPayload_EntryFunctionPayload { const typeParamStrings = $p.map(t=>$.getTypeTagFullname(t)); return $.buildPayload( new HexString("0x1"), "managed_coin", "register", typeParamStrings, [], isJSON, ); } export function loadParsers(repo: AptosParserRepo) { repo.addParser("0x1::managed_coin::Capabilities", Capabilities.CapabilitiesParser); } export class App { constructor( public client: AptosClient, public repo: AptosParserRepo, public cache: AptosLocalCache, ) { } get moduleAddress() {{ return moduleAddress; }} get moduleName() {{ return moduleName; }} get Capabilities() { return Capabilities; } async loadCapabilities( owner: HexString, $p: TypeTag[], /* */ loadFull=true, fillCache=true, ) { const val = await Capabilities.load(this.repo, this.client, owner, $p); if (loadFull) { await val.loadFullState(this); } if (fillCache) { this.cache.set(val.typeTag, owner, val); } return val; } payload_burn( amount: U64, $p: TypeTag[], /* */ isJSON = false, ): TxnBuilderTypes.TransactionPayloadEntryFunction | Types.TransactionPayload_EntryFunctionPayload { return buildPayload_burn(amount, $p, isJSON); } async burn( _account: AptosAccount, amount: U64, $p: TypeTag[], /* */ option?: OptionTransaction, _isJSON = false ) { const payload__ = buildPayload_burn(amount, $p, _isJSON); return $.sendPayloadTx(this.client, _account, payload__, option); } payload_initialize( name: U8[], symbol: U8[], decimals: U8, monitor_supply: boolean, $p: TypeTag[], /* */ isJSON = false, ): TxnBuilderTypes.TransactionPayloadEntryFunction | Types.TransactionPayload_EntryFunctionPayload { return buildPayload_initialize(name, symbol, decimals, monitor_supply, $p, isJSON); } async initialize( _account: AptosAccount, name: U8[], symbol: U8[], decimals: U8, monitor_supply: boolean, $p: TypeTag[], /* */ option?: OptionTransaction, _isJSON = false ) { const payload__ = buildPayload_initialize(name, symbol, decimals, monitor_supply, $p, _isJSON); return $.sendPayloadTx(this.client, _account, payload__, option); } payload_mint( dst_addr: HexString, amount: U64, $p: TypeTag[], /* */ isJSON = false, ): TxnBuilderTypes.TransactionPayloadEntryFunction | Types.TransactionPayload_EntryFunctionPayload { return buildPayload_mint(dst_addr, amount, $p, isJSON); } async mint( _account: AptosAccount, dst_addr: HexString, amount: U64, $p: TypeTag[], /* */ option?: OptionTransaction, _isJSON = false ) { const payload__ = buildPayload_mint(dst_addr, amount, $p, _isJSON); return $.sendPayloadTx(this.client, _account, payload__, option); } payload_register( $p: TypeTag[], /* */ isJSON = false, ): TxnBuilderTypes.TransactionPayloadEntryFunction | Types.TransactionPayload_EntryFunctionPayload { return buildPayload_register($p, isJSON); } async register( _account: AptosAccount, $p: TypeTag[], /* */ option?: OptionTransaction, _isJSON = false ) { const payload__ = buildPayload_register($p, _isJSON); return $.sendPayloadTx(this.client, _account, payload__, option); } }