首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在近钱包(AssemblyScript)中显示我的NFT?

如何在近钱包(AssemblyScript)中显示我的NFT?
EN

Stack Overflow用户
提问于 2022-01-17 09:28:41
回答 1查看 317关注 0票数 3

我正在尝试实现我自己的NFT合约,以下是本教程的内容不可替换令牌(NEP-171)规范。本教程是用Rust编写的,但我正在尝试对AssemblyScript做类似的操作。我想,如果我用正确的名称和签名实现了这些方法,那么近钱包就有可能在我的NFT合同上调用相应的方法(例如nft_tokens_for_owner)。我只是想知道我是不是错过了什么,或者我是否对它应该如何工作有错误的理解。

我已经创建了一个NFT令牌,在我的合同中使用nft_mint方法,使用我自己的testnet帐户。事务可以找到这里。但是,NFT并没有显示在我的testnet钱包中的“收藏品”选项卡中。

我的合同(index.ts)如下:

代码语言:javascript
复制
import { PersistentMap } from 'near-sdk-as';
import { Token, TokenMetadata } from './reit-token';

@nearBindgen
class NFTContractMetadata {
  spec: string; // required, essentially a version like "nft-1.0.0"
  name: string; // required, ex. "Mochi Rising — Digital Edition" or "Metaverse 3"
  symbol: string; // required, ex. "MOCHI"
  icon: string | null; // Data URL
  base_uri: string | null; // Centralized gateway known to have reliable access to decentralized storage assets referenced by `reference` or `media` URLs
  reference: string | null; // URL to a JSON file with more info
  reference_hash: string | null; // Base64-encoded sha256 hash of JSON from reference field. Required if `reference` is included.
}

@nearBindgen
export class Contract {
  //keeps track of the metadata for the contract
  metadata: NFTContractMetadata = {
    spec: 'reit-token-0.0.0',
    name: 'Reit Token',
    symbol: 'REIT',
    icon: null,
    base_uri: null,
    reference: null,
    reference_hash: null,
  };

  //contract owner
  owner_id: string; // Not sure if this is relevant for the contract itself

  //keeps track of all the token IDs for a given account
  tokens_per_owner: PersistentMap<string, Array<string>> = new PersistentMap<
    string,
    Array<string>
  >('tokens_pr_owner');

  //keeps track of the token struct for a given token ID
  tokens_by_id: PersistentMap<string, Token> = new PersistentMap<string, Token>(
    'tokens_by_id'
  );

  //keeps track of the token metadata for a given token ID
  token_metadata_by_id: PersistentMap<string, TokenMetadata> =
    new PersistentMap<string, TokenMetadata>('token_metadata_by_id');

  nft_tokens_for_owner(account_id: string): Array<Token> {
    const tokenIds: string[] = this.tokens_per_owner.getSome(account_id);

    const tokens: Array<Token> = new Array<Token>();
    for (let i = 0; i < tokenIds.length; ++i) {
      const token: Token = this.tokens_by_id.getSome(tokenIds[i]);
      tokens.push(token);
    }
    return tokens;
  }

  nft_mint(
    token_id: string,
    metadata: TokenMetadata,
    receiver_id: string
  ): void {
    // assert(
    //   this.tokens_by_id.contains(token_id),
    //   'ID is already taken, create new ID'
    // );
    const token = new Token(token_id, metadata, receiver_id);
    const tokens: Array<string> = new Array<string>();
    tokens.push(token_id);
    this.tokens_per_owner.set(receiver_id, tokens);
    this.tokens_by_id.set(token_id, token);
    this.token_metadata_by_id.set(token_id, token.metadata);
  }

内部reit-令牌。

代码语言:javascript
复制
import { ContractPromise } from 'near-sdk-as';
// implementation based on NEP-171
// https://nomicon.io/Standards/NonFungibleToken/Core.html

@nearBindgen
export class TokenMetadata {
  title: string; // ex. "Arch Nemesis: Mail Carrier" or "Parcel #5055"
  description: string; // free-form description
  media: string; // URL to associated media, preferably to decentralized, content-addressed storage
  media_hash: string; // Base64-encoded sha256 hash of content referenced by the `media` field. Required if `media` is included.
  copies: number; // number of copies of this set of metadata in existence when token was minted.
  issued_at: number; // When token was issued or minted, Unix epoch in milliseconds
  expires_at: number; // When token expires, Unix epoch in milliseconds
  starts_at: number; // When token starts being valid, Unix epoch in milliseconds
  updated_at: number; // When token was last updated, Unix epoch in milliseconds
  extra: string; // anything extra the NFT wants to store on-chain. Can be stringified JSON.
  reference: string; // URL to an off-chain JSON file with more info.
  reference_hash: string; // Base64-encoded sha256 hash of JSON from reference field. Required if `reference` is included.
}

@nearBindgen
export class Token {
  id: string;
  owner_id: string;
  metadata: TokenMetadata;
  constructor(token_id: string, metadata: TokenMetadata, receiver_id: string) {
    this.id = token_id;
    this.metadata = metadata;
    this.owner_id = receiver_id;
  }
}

@nearBindgen
export class ReitToken {
  token: Token;

  constructor(token_id: string, metadata: TokenMetadata, receiver_id: string) {
    this.token = { id: token_id, metadata: metadata, owner_id: receiver_id };
  }
  // --- view methods --- //

  nft_token(): Token {
    return this.token;
  }

  // --- change methods --- //

  nft_transfer(
    receiver_id: string,
    token_id: string,
    approval_id: number,
    memo: string
  ): void {
    // assert(false, 'nft_transfer not implemented');
  }

  nft_transfer_call(
    receiver_id: string,
    token_id: string,
    approval_id: number,
    memo: string,
    msg: string
  ): ContractPromise {
    // assert(false, 'nft_transfer_call not implemented');
    return ContractPromise.create('', '', {}, 1);
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-19 13:23:01

在询问之后,我看到了两个不同的GitHub存储库,它们在AssemblyScript中实现了一个NFT令牌智能契约。

在查看了这些存储库之后,我注意到我的合同离在钱包中显示我的NFT令牌不远了。我不得不再实现一个函数,nft_metadata()

我的合同中确实有元数据,但是作为一个变量,metadata。在nft_metadata()中返回相同的元数据似乎很有效果。

代码语言:javascript
复制
@nearBindgen
class NFTContractMetadata {
  constructor(
    public spec: string = 'reit-token-0.0.0', // required, essentially a version like "nft-1.0.0"
    public name: string = 'Reit Token', // required, ex. "Mochi Rising — Digital Edition" or "Metaverse 3"
    public symbol: string = 'REIT', // required, ex. "MOCHI"
    public icon: string = '', // Data URL
    public base_uri: string = '', // Centralized gateway known to have reliable access to decentralized storage assets referenced by `reference` or `media` URLs
    public reference: string = '', // URL to a JSON file with more info
    public reference_hash: string = '' // Base64-encoded sha256 hash of JSON from reference field. Required if `reference` is included.
  ) {}
}

@nearBindgen
export class Contract {
// ...

  nft_metadata(): NFTContractMetadata {
    return new NFTContractMetadata();
  }

// ...
}

在测试时,我确实用一个新的NFT (在这里找到的交易)覆盖了我现有的NFT,它在近测试网钱包中是可见的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70739089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档