ERC-721 的鷹架式 TypeScript NFT 專案

Blockchain App Builder 會從您的 NFT 規格檔取得輸入,並產生功能完整的鷹架式鏈碼專案。

專案會自動產生 NFT 生命週期類別和函數,包括 CRUD 和非 CRUD 方法,以及權杖化 SDK。系統會自動支援引數驗證、封送處理 (Marshal) / 解除封送處理 (unmarshal) 以及透明保存功能。

如需鷹架式專案的資訊,以及與 NFT 無直接相關的方法,請參閱 Scaffolded TypeScript Chaincode Project

Model

每個權杖化模型類別都會擴充 OchainModel 類別。在 OchainModel 類別中擷取「通透保存功能 (Transparent Persistence Capability)」或簡化的 ORM。

import * as yup from 'yup';
import { Id, Mandatory, Validate, Default, Embedded, Derived, ReadOnly } from '../../lib/decorators';
import { OchainModel } from '../../lib/ochain-model';
import { STRATEGY } from '../../lib/utils';
import { EmbeddedModel } from '../../lib/ochain-embedded-model';

export class ArtCollectionMetadata extends EmbeddedModel<ArtCollectionMetadata> {
    @Validate(yup.string())
    public painting_name: string;

    @Validate(yup.string())
    public description: string;

    @Validate(yup.string())
    public image: string;

    @Validate(yup.string())
    public painter_name: string;

}
    
@Id('tokenId')       
export class ArtCollection extends OchainModel<ArtCollection> {

    public readonly assetType = 'otoken';
        
    @Mandatory()
    @Validate(yup.string().required().matches(/^[A-Za-z0-9][A-Za-z0-9_-]*$/).max(16))
    public tokenId: string;

    @ReadOnly('artcollection')
    public tokenName: string;

    @Validate(yup.string().trim().max(256))
    public tokenDesc: string;

    @ReadOnly('ART')
    public symbol: string;

    @ReadOnly('erc721+')
    public tokenStandard: string;

    @ReadOnly('nonfungible')
    public tokenType: string;

    @ReadOnly('whole')
    public tokenUnit: string;

      @ReadOnly(["indivisible","singleton","mintable","transferable","burnable","roles"])
    public behaviors: string[];

    @ReadOnly({minter_role_name: "minter"})
    public roles: object;

    @ReadOnly({max_mint_quantity: 20000})
    public mintable: object;

    @Validate(yup.string())
    public owner: string;

    @Validate(yup.string())
    public createdBy: string;

    @Validate(yup.string())
    public transferredBy: string;

    @Validate(yup.string())
    public creationDate: string;

    @Validate(yup.string())
    public transferredDate: string;

    @Validate(yup.bool())
    public isBurned: boolean;

    @Validate(yup.string())
    public burnedBy: string;

    @Validate(yup.string())
    public burnedDate: string;

    @Validate(yup.string().max(2000))
    public tokenUri: string;
    
    @Embedded(ArtCollectionMetadata)
    public metadata: ArtCollectionMetadata;

    @Validate(yup.number())
    public price: number;

    @Validate(yup.boolean())
    public on_sale_flag: boolean;

}

控制器

主控制器類別延伸了 OchainController 類別。只有一個主控制器。

export class DigiCurrCCController extends OchainController{

您可以建立不限數目的類別、函數或檔案,但只能呼叫在主控制器類別中定義的方法。其他方法則為隱藏。

您可以使用記號 SDK 方法,為商業應用程式撰寫自訂方法。

自動產生的 NFT 方法

Blockchain App Builder 會自動產生支援 NFT 和 NFT 生命週期的方法。您可以使用這些方法來初始化 NFT、管理角色和帳戶,以及完成其他 NFT 生命週期作業,而無需進行任何其他編碼。控制器方法必須要有 @Validator(...params) 修飾器才能呼叫。

存取控制管理的方法

addTokenAdmin
此方法會將使用者新增為鏈碼的 Token Admin。鏈碼的 Token Admin 只能呼叫此方法。
@Validator(yup.string(), yup.string())
public async addTokenAdmin(orgId: string, userId: string) {
    await this.Ctx.ERC721Auth.checkAuthorization('ERC721ADMIN.addAdmin', 'TOKEN');
    return await this.Ctx.ERC721Admin.addAdmin(orgId, userId);
}
參數:
  • orgId: string - 目前組織中使用者的成員服務提供者 (MSP) ID。
  • userId: string - 使用者的使用者名稱或電子郵件 ID。
傳回值:
  • 成功時,包含新增為鏈碼 Token Admin 之使用者詳細資訊的訊息。
傳回值範例:
{"msg":"Successfully added Admin (orgId: Org1MSP, userId: User1)"}
removeTokenAdmin
此方法會將使用者移除為鏈碼的 Token Admin。鏈碼的 Token Admin 只能呼叫此方法。
@Validator(yup.string(), yup.string())
public async removeTokenAdmin(orgId: string, userId: string) {
   await this.Ctx.ERC721Auth.checkAuthorization('ERC721ADMIN.removeAdmin', 'TOKEN');
   return await this.Ctx.ERC721Admin.removeAdmin(orgId, userId);
}
參數:
  • orgId: string - 目前組織中使用者的成員服務提供者 (MSP) ID。
  • userId: string - 使用者的使用者名稱或電子郵件 ID。
傳回值:
  • 成功時,包含以鏈碼 Token Admin 移除之使用者詳細資訊的訊息。
傳回值範例:
{"msg": "Successfully removed Admin (orgId: Org1MSP, userId: User1)"}
isTokenAdmin
如果函數的呼叫程式是 Token Admin,此方法會傳回布林值 true,否則會傳回 falseToken Admin 可在區塊鏈網路中的任何其他使用者呼叫此功能。其他使用者只能在自己的帳戶呼叫此方法。
@GetMethod()
@Validator(yup.string(), yup.string())
public async isTokenAdmin(orgId: string, userId: string) {
    await this.Ctx.ERC721Auth.checkAuthorization('ERC721ADMIN.isUserTokenAdmin', 'TOKEN');
    return await this.Ctx.ERC721Auth.isUserTokenAdmin(orgId, userId);
}
參數:
  • orgId: string - 目前組織中使用者的成員服務提供者 (MSP) ID。
  • userId: string - 使用者的使用者名稱或電子郵件 ID。
傳回值:
  • 如果呼叫程式是 Token Admin,此方法會傳回 true,否則會傳回 false
傳回值範例:
{"result": true}
getAllTokenAdmins
此方法會傳回屬於鏈碼 Token Admin 的所有使用者清單。鏈碼的 Token Admin 只能呼叫此方法。
@GetMethod()
@Validator()
public async getAllTokenAdmins() {
    await this.Ctx.ERC721Auth.checkAuthorization('ERC721ADMIN.getAllAdmins', 'TOKEN');
    return await this.Ctx.ERC721Admin.getAllAdmins();
}
參數:
傳回值:
  • 成功時,JSON 格式的 admins 陣列包含 orgIduserId 物件。
傳回值範例:
{"admins":[{"orgId":"Org1MSP","userId":"admin"}]}

記號組態管理的方法

init
建立鏈碼時會呼叫此方法。每個 Token Admin 都是由 adminList 參數中的 userIdorgId 資訊所識別。userId 是執行處理擁有者或登入執行處理之使用者的使用者名稱或電子郵件 ID。orgId 是目前網路組織中使用者的成員服務提供者 (MSP) ID。第一次部署鏈碼時,adminList 參數是必要的。如果您要升級鏈碼,請傳送空白清單 ([])。升級時會忽略 adminList 參數中的任何其他資訊。
@Validator(yup.array().of(yup.object()).nullable())
public async init(adminList: ERC721TokenAdminAsset[]) {
   await this.Ctx.ERC721Admin.initAdmin(adminList);
   await this.Ctx.ERC721Token.saveClassInfo(<NFT_NAME>);
   await this.Ctx.ERC721Token.saveDeleteTransactionInfo();
   return;
}
參數:
  • adminList array - 指定記號管理員清單的 {orgId, userId} 資訊陣列。adminList 陣列是必要參數。
getAllTokens
此方法會傳回儲存在狀態資料庫中的所有記號資產。鏈碼的 Token Admin 只能呼叫此方法。此方法使用 Berkeley 資料庫 SQL 豐富查詢,且只能在連線至遠端 Oracle Blockchain Platform 網路時呼叫。
@GetMethod()
@Validator()
public async getAllTokens() {
    await this.Ctx.ERC721Auth.checkAuthorization('ERC721TOKEN.getAllTokens', 'TOKEN');
    return await this.Ctx.ERC721Token.getAllTokens();
}
參數:
傳回值:
  • JSON 格式的所有權杖資產清單。
傳回值範例:
[
    {
        "key": "monalisa",
        "valueJson": {
            "metadata": {
                "PaintingName": "Mona_Lisa",
                "Description": "Mona Lisa Painting",
                "Image": "monalisa.jpeg",
                "PainterName": "Leonardo_da_Vinci"
            },
            "assetType": "otoken",
            "tokenId": "monalisa",
            "tokenName": "ravinft",
            "tokenDesc": "token Description",
            "symbol": "PNT",
            "tokenStandard": "erc721+",
            "tokenType": "nonfungible",
            "tokenUnit": "whole",
            "behaviors": [
                "indivisible",
                "singleton",
                "mintable",
                "transferable",
                "burnable",
                "roles"
            ],
            "roles": {
                "minter_role_name": "minter",
                "burner_role_name": "burner"
            },
            "mintable": {
                "max_mint_quantity": 20000
            },
            "owner": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1",
            "createdBy": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1",
            "creationDate": "2022-04-07T21:17:48.000Z",
            "isBurned": false,
            "tokenUri": "https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg",
            "NftBasePrice": 100
        }
    },
    {
        "key": "monalisa1",
        "valueJson": {
            "metadata": {
                "PaintingName": "Mona_Lisa",
                "Description": "Mona Lisa Painting",
                "Image": "monalisa.jpeg",
                "PainterName": "Leonardo_da_Vinci"
            },
            "assetType": "otoken",
            "tokenId": "monalisa1",
            "tokenName": "ravinft",
            "tokenDesc": "token Description",
            "symbol": "PNT",
            "tokenStandard": "erc721+",
            "tokenType": "nonfungible",
            "tokenUnit": "whole",
            "behaviors": [
                "indivisible",
                "singleton",
                "mintable",
                "transferable",
                "burnable",
                "roles"
            ],
            "roles": {
                "minter_role_name": "minter",
                "burner_role_name": "burner"
            },
            "mintable": {
                "max_mint_quantity": 20000
            },
            "owner": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1",
            "createdBy": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1",
            "creationDate": "2022-04-07T21:17:59.000Z",
            "isBurned": false,
            "tokenUri": "https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg",
            "NftBasePrice": 100
        }
    }
]
getAllTokensByUser
此方法會傳回指定使用者擁有的所有權杖資產。此方法使用 Berkeley 資料庫 SQL 豐富查詢,且只能在連線至遠端 Oracle Blockchain Platform 網路時呼叫。此方法只能由鏈碼的 Token Admin 或帳戶擁有者呼叫。
@GetMethod()
@Validator(yup.string(), yup.string())
public async getAllTokensByUser(orgId: string, userId: string) {
    const accountId = await this.Ctx.ERC721Account.generateAccountId(orgId, userId);
    await this.Ctx.ERC721Auth.checkAuthorization('ERC721TOKEN.getAllTokensByUser', 'TOKEN', { accountId });
    return await this.Ctx.ERC721Token.getAllTokensByUser(accountId);
}
參數:
  • orgId: string - 目前組織中使用者的成員服務提供者 (MSP) ID。
  • userId: string - 使用者的使用者名稱或電子郵件 ID。
傳回值:
  • JSON 格式的權杖資產清單。
傳回值範例:
[
    {
        "key": "monalisa",
        "valueJson": {
            "metadata": {
                "PaintingName": "Mona_Lisa",
                "Description": "Mona Lisa Painting",
                "Image": "monalisa.jpeg",
                "PainterName": "Leonardo_da_Vinci"
            },
            "assetType": "otoken",
            "tokenId": "monalisa",
            "tokenName": "ravinft",
            "tokenDesc": "token Description",
            "symbol": "PNT",
            "tokenStandard": "erc721+",
            "tokenType": "nonfungible",
            "tokenUnit": "whole",
            "behaviors": [
                "indivisible",
                "singleton",
                "mintable",
                "transferable",
                "burnable",
                "roles"
            ],
            "roles": {
                "minter_role_name": "minter",
                "burner_role_name": "burner"
            },
            "mintable": {
                "max_mint_quantity": 20000
            },
            "owner": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1",
            "createdBy": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1",
            "creationDate": "2022-04-07T21:17:48.000Z",
            "isBurned": false,
            "tokenUri": "https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg",
            "NftBasePrice": 100
        }
    },
    {
        "key": "monalisa1",
        "valueJson": {
            "metadata": {
                "PaintingName": "Mona_Lisa",
                "Description": "Mona Lisa Painting",
                "Image": "monalisa.jpeg",
                "PainterName": "Leonardo_da_Vinci"
            },
            "assetType": "otoken",
            "tokenId": "monalisa1",
            "tokenName": "ravinft",
            "tokenDesc": "token Description",
            "symbol": "PNT",
            "tokenStandard": "erc721+",
            "tokenType": "nonfungible",
            "tokenUnit": "whole",
            "behaviors": [
                "indivisible",
                "singleton",
                "mintable",
                "transferable",
                "burnable",
                "roles"
            ],
            "roles": {
                "minter_role_name": "minter",
                "burner_role_name": "burner"
            },
            "mintable": {
                "max_mint_quantity": 20000
            },
            "owner": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1",
            "createdBy": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1",
            "creationDate": "2022-04-07T21:17:59.000Z",
            "isBurned": false,
            "tokenUri": "https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg",
            "NftBasePrice": 100
        }
    }
]
getTokenById
如果記號存在於狀態資料庫中,這個方法就會傳回記號物件。此方法只能由鏈碼的 Token Admin 或記號擁有者呼叫。
@GetMethod()
@Validator(yup.string())
public async getTokenById(tokenId: string) {
   await this.Ctx.ERC721Auth.checkAuthorization('ERC721TOKEN.get', 'TOKEN', { tokenId });
   let token = await this.getTokenObject(tokenId);
   return token;
}
參數:
  • tokenId: string - 要取得之記號的 ID。
傳回值:
  • JSON 格式的權杖資產。
傳回值範例:
{
    "metadata": {
        "painting_name": "Mona_Lisa",
        "description": "Mona Lisa Painting",
        "image": "monalisa.jpeg",
        "painter_name": "Leonardo_da_Vinci"
    },
    "assetType": "otoken",
    "tokenId": "monalisa",
    "tokenName": "artcollection",
    "tokenDesc": "token description",
    "symbol": "ART",
    "tokenStandard": "erc721+",
    "tokenType": "nonfungible",
    "tokenUnit": "whole",
    "behaviors": [
        "indivisible",
        "singleton",
        "mintable",
        "transferable",
        "burnable",
        "roles"
    ],
    "roles": {
        "minter_role_name": "minter"
    },
    "mintable": {
        "max_mint_quantity": 20000
    },
    "owner": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
    "createdBy": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
    "transferredBy": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
    "creationDate": "2022-04-05T08:30:42.000Z",
    "transferredDate": "2022-04-05T09:28:30.000Z",
    "isBurned": false,
    "tokenUri": "https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg",
    "price": 100,
    "on_sale_flag": true
}
getTokenHistory
此方法會傳回指定記號 ID 的歷史記錄。這是非同步方法。連線至遠端 Oracle Blockchain Platform 網路時才能呼叫此方法。任何人都可以呼叫此方法。
@GetMethod()
@Validator(yup.string())
public async getTokenHistory(tokenId: string) {
   // await this.Ctx.ERC721Auth.checkAuthorization('ERC721TOKEN.history', 'TOKEN');
   return await this.Ctx.ERC721Token.history(tokenId);
}
參數:
  • tokenId: string - 記號的 ID。
傳回值範例:
[
    {
        "trxId": "ca4c07bf04240345de918cbf1f4f3da4b4d0ab044c5b8bea94343e427d9ed4e7",
        "timeStamp": 1649150910,
        "value": {
            "metadata": {
                "painting_name": "Mona_Lisa",
                "description": "Mona Lisa Painting",
                "image": "monalisa.jpeg",
                "painter_name": "Leonardo_da_Vinci"
            },
            "assetType": "otoken",
            "tokenId": "monalisa",
            "tokenName": "artcollection",
            "tokenDesc": "token description",
            "symbol": "ART",
            "tokenStandard": "erc721+",
            "tokenType": "nonfungible",
            "tokenUnit": "whole",
            "behaviors": [
                "indivisible",
                "singleton",
                "mintable",
                "transferable",
                "burnable",
                "roles"
            ],
            "roles": {
                "minter_role_name": "minter"
            },
            "mintable": {
                "max_mint_quantity": 20000
            },
            "owner": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
            "createdBy": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
            "transferredBy": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
            "creationDate": "2022-04-05T08:30:42.000Z",
            "transferredDate": "2022-04-05T09:28:30.000Z",
            "isBurned": false,
            "tokenUri": "https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg",
            "price": 100,
            "on_sale_flag": true
        }
    },
    {
        "trxId": "cfb52ffc8c34c7fd86210fcf8c5f53d9f92a056c45ed3a33671d638020c1f9cb",
        "timeStamp": 1649149545,
        "value": {
            "metadata": {
                "painting_name": "Mona_Lisa",
                "description": "Mona Lisa Painting",
                "image": "monalisa.jpeg",
                "painter_name": "Leonardo_da_Vinci"
            },
            "assetType": "otoken",
            "tokenId": "monalisa",
            "tokenName": "artcollection",
            "tokenDesc": "token description",
            "symbol": "ART",
            "tokenStandard": "erc721+",
            "tokenType": "nonfungible",
            "tokenUnit": "whole",
            "behaviors": [
                "indivisible",
                "singleton",
                "mintable",
                "transferable",
                "burnable",
                "roles"
            ],
            "roles": {
                "minter_role_name": "minter"
            },
            "mintable": {
                "max_mint_quantity": 20000
            },
            "owner": "oaccount~ec32cff8635a056f3dda3da70b1d6090d61f66c6a170c4a95fd008181f729dba",
            "createdBy": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
            "transferredBy": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
            "creationDate": "2022-04-05T08:30:42.000Z",
            "transferredDate": "2022-04-05T09:05:45.000Z",
            "isBurned": false,
            "tokenUri": "https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg",
            "price": 100,
            "on_sale_flag": true
        }
    },
    {
        "trxId": "702e61cc8d6d2982521023d0d5f3195900f35e146d6a90ef66daae551e6075d2",
        "timeStamp": 1649147729,
        "value": {
            "metadata": {
                "painting_name": "Mona_Lisa",
                "description": "Mona Lisa Painting",
                "image": "monalisa.jpeg",
                "painter_name": "Leonardo_da_Vinci"
            },
            "assetType": "otoken",
            "tokenId": "monalisa",
            "tokenName": "artcollection",
            "tokenDesc": "token description",
            "symbol": "ART",
            "tokenStandard": "erc721+",
            "tokenType": "nonfungible",
            "tokenUnit": "whole",
            "behaviors": [
                "indivisible",
                "singleton",
                "mintable",
                "transferable",
                "burnable",
                "roles"
            ],
            "roles": {
                "minter_role_name": "minter"
            },
            "mintable": {
                "max_mint_quantity": 20000
            },
            "owner": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
            "createdBy": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
            "creationDate": "2022-04-05T08:30:42.000Z",
            "isBurned": false,
            "tokenUri": "https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg",
            "price": 100,
            "on_sale_flag": true
        }
    },
    {
        "trxId": "e7747b3001a170f88688620956320e9402e1dd8edad8afb4818a08a34647337c",
        "timeStamp": 1649147442,
        "value": {
            "metadata": {
                "painting_name": "Mona_Lisa",
                "description": "Mona Lisa Painting",
                "image": "monalisa.jpeg",
                "painter_name": "Leonardo_da_Vinci"
            },
            "assetType": "otoken",
            "tokenId": "monalisa",
            "tokenName": "artcollection",
            "tokenDesc": "token description",
            "symbol": "ART",
            "tokenStandard": "erc721+",
            "tokenType": "nonfungible",
            "tokenUnit": "whole",
            "behaviors": [
                "indivisible",
                "singleton",
                "mintable",
                "transferable",
                "burnable",
                "roles"
            ],
            "roles": {
                "minter_role_name": "minter"
            },
            "mintable": {
                "max_mint_quantity": 20000
            },
            "owner": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
            "createdBy": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
            "creationDate": "2022-04-05T08:30:42.000Z",
            "isBurned": false,
            "tokenUri": "\"https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg\"",
            "price": 100,
            "on_sale_flag": false
        }
    }
]
getTokenObject
這是傳回指定記號 ID 之記號執行處理的公用程式方法。許多自動產生的方法會使用此方法來擷取記號物件。您可以視需要從自訂方法呼叫此方法。建立權杖化資產或類別時,請使用對應的 Token 類別更新交換器案例,以傳回正確的權杖物件。區塊鏈 App 產生器中的 ochain sync 命令會在規格檔案中建立權杖化資產時,自動建立交換器案例。此方法沒有 @Validator() 方法修飾器,這表示此方法無法直接呼叫,而且只能從其他方法呼叫。
public async getTokenObject<T extends OchainModel<any>>(tokenId: string): Promise<T> {
   if (!tokenId) {
        throw Error('TokenID cannot be null/empty.');
    }
    const token = await this.Ctx.ERC721Token.get(tokenId);
    if (token.tokenName && token.assetType && token.assetType === 'otoken') {
        let tokenAsset;
        switch (token.tokenName) {
           case '<NFT_NAME in lowercase>':
               tokenAsset = new <NFT_NAME>(token, false, true);
               return tokenAsset;
           default:
               throw new Error(`No token exists with ID [${tokenId}]`);
        }
    } else {
        throw new Error(`No token exists with ID [${tokenId}]`);
    }
}
參數:
  • tokenId: string - 記號的 ID。
ownerOf
此方法會傳回指定記號 ID 之擁有者的帳戶 ID。任何人都可以呼叫此方法。
@GetMethod()
@Validator(yup.string())
public async ownerOf(tokenId: string) {
   return await this.Ctx.ERC721Token.ownerOf(tokenId);
}
參數:
  • tokenId: string - 記號的 ID。
傳回值:
  • 擁有者帳戶 ID 的 JSON 物件。
傳回值範例:
{"owner": "oaccount~d6d22c3167e3c6ab9ee5653e1a008c37c20cc47ebb0229ca0aedfafe64c675b8"}
name
此方法會傳回記號類別的名稱。任何人都可以呼叫此方法。
@GetMethod()
@Validator()
public async name() {
   return await this.Ctx.ERC721Token.name();
}
參數:
傳回值:
  • 權杖名稱的 JSON 物件。
傳回值範例:
{"tokenName": "artcollection"}
symbol
這個方法會傳回記號類別的符號。任何人都可以呼叫此方法。
@GetMethod()
@Validator()
public async symbol() {
   return await this.Ctx.ERC721Token.symbol();
}
參數:
傳回值:
  • 記號符號的 JSON 物件。
傳回值範例:
{"symbol": "PNT"}
tokenURI
此方法會傳回指定記號的 URI。任何人都可以呼叫此方法。
@GetMethod()
@Validator(yup.string())
public async tokenURI(tokenId: string) {
   return await this.Ctx.ERC721Token.tokenURI(tokenId);
}
參數:
  • tokenId: string - 記號的 ID。
傳回值:
  • 成功時,記號 URI 的 JSON 物件。
傳回值範例:
{"tokenURI": "https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\
.ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg"}
totalSupply
此方法會傳回已轉換記號的總數。鏈碼的 Token Admin 只能呼叫此方法。
@GetMethod()
@Validator()
public async totalSupply() {
  await this.Ctx.ERC721Auth.checkAuthorization('ERC721TOKEN.totalSupply', 'TOKEN');
  return await this.Ctx.ERC721Token.totalSupply();
}
參數:
傳回值:
  • 成功時,記號計數的 JSON 物件。
傳回值範例:
{"totalSupply": 3}
totalNetSupply
這個方法會傳回經過 minted 記號減去燒錄記號數目的總數。鏈碼的 Token Admin 只能呼叫此方法。
@GetMethod()
@Validator()
public async totalNetSupply() {
    await this.Ctx.ERC721Auth.checkAuthorization('ERC721TOKEN.totalNetSupply', 'TOKEN');
    return await this.Ctx.ERC721Token.getTotalMintedTokens();
}
參數:
傳回值:
  • 成功時,記號計數的 JSON 物件。
傳回值範例:
{"totalNetSupply": 1}

帳戶管理方法

createAccount
此方法會為指定的使用者和記號建立一個帳戶。必須為任何時候會有權杖的任何使用者建立帳戶。帳戶會追蹤使用者擁有的 NFT 數目。使用者必須在網路中擁有帳戶,才能完成權杖相關作業。每位使用者只能建立一個 NFT 帳戶。

帳戶 ID 是一組文數字字元,前面加上 oaccount~,後面加上目前網路組織中使用者之成員服務提供者 ID (orgId) 的 SHA-256 雜湊、執行處理擁有者的使用者名稱或電子郵件 ID (userId)、登入執行處理的使用者,以及常數字串 nft。鏈碼的 Token Admin 只能呼叫此方法。

@Validator(yup.string(), yup.string(), yup.string())
public async createAccount(org_id: string, user_id: string, token_type: string) {
  await this.Ctx.Auth.checkAuthorization("ACCOUNT.createAccount", "TOKEN", { org_id });
  return await this.Ctx.Account.createAccount(org_id, user_id, token_type);
}
參數:
  • orgId: string - 目前組織中使用者的成員服務提供者 (MSP) ID。
  • userId: string - 使用者的使用者名稱或電子郵件 ID。
  • tokenType: string - 唯一支援的權杖類型是 nonfungible
傳回值:
  • 成功時,所建立帳戶的 JSON 物件。bapAccountVersion 參數定義於帳戶物件中供內部使用。
傳回值範例:
{
    "assetType": "oaccount",
    "accountId": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
    "bapAccountVersion": 0,
    "userId": "admin",
    "orgId": "Org1MSP",
    "tokenType": "nonfungible",
    "noOfNfts": 0
}
balanceOf
此方法會傳回指定使用者持有的 NFT 總數。此方法只能由鏈碼的 Token Admin 或帳戶擁有者呼叫。
@GetMethod()
@Validator(yup.string(), yup.string())
 public async balanceOf(orgId: string, userId: string) {
     await this.Ctx.ERC721Auth.checkAuthorization('ERC721ACCOUNT.balanceOf', 'TOKEN', { orgId, userId });
     const accountId = await this.Ctx.ERC721Account.generateAccountId(orgId, userId);
     return await this.Ctx.ERC721Account.balanceOf(accountId);
 }
參數:
  • orgId: string - 目前組織中使用者的成員服務提供者 (MSP) ID。
  • userId: string - 使用者的使用者名稱或電子郵件 ID。
傳回值:
  • 目前 NFT 數目的 JSON 物件。
傳回值範例:
{"totalNfts": 0}
getAllAccounts
此方法會傳回所有帳戶的清單。鏈碼的 Token Admin 只能呼叫此方法。此方法使用 Berkeley 資料庫 SQL 豐富查詢,且只能在連線至遠端 Oracle Blockchain Platform 網路時呼叫。
@GetMethod()
@Validator()
public async getAllAccounts() {
    await this.Ctx.ERC721Auth.checkAuthorization('ERC721ACCOUNT.getAllAccounts', 'TOKEN');
    return await this.Ctx.ERC721Account.getAllAccounts();
}
參數:
傳回值:
  • 成功時,所有帳戶的 JSON 陣列。
傳回值範例:
[
    {
        "key": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
        "valueJson": {
            "assetType": "oaccount",
            "accountId": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
            "userId": "admin",
            "orgId": "Org1MSP",
            "tokenType": "nonfungible",
            "noOfNfts": 1
        }    
    }
]
getAccountByUser
此方法會傳回指定使用者的帳戶詳細資訊。此方法只能由鏈碼的 Token Admin 或帳戶的 Account Owner 呼叫。
@GetMethod()
@Validator(yup.string(), yup.string())
public async getAccountByUser(orgId: string, userId: string) {
    await this.Ctx.ERC721Auth.checkAuthorization('ERC721ACCOUNT.getAccountByUser', 'TOKEN', { orgId, userId });
    return await this.Ctx.ERC721Account.getAccountWithStatusByUser(orgId, userId);
}
參數:
  • orgId: string - 目前組織中使用者的成員服務提供者 (MSP) ID。
  • userId: string - 使用者的使用者名稱或電子郵件 ID。
傳回值:
  • 成功時,包含下列特性的 JSON 帳戶物件:
  • bapAccountVersion - 內部使用的帳戶物件參數。
  • status - 使用者帳戶的目前狀態。
  • accountId - 使用者帳戶的 ID。
  • userId - 使用者的使用者名稱或電子郵件 ID。
  • orgId - 目前組織中使用者的成員服務提供者 (MSP) ID。
  • tokenType - 帳戶保留的權杖類型。
  • noOfNfts - 帳戶持有的 NFT 總數。
傳回值範例:
{
  "bapAccountVersion": 0,
  "assetType": "oaccount",
  "status": "active",
  "accountId": "oaccount~cc301bee057f14236a97d434909ec1084970921b008f6baab09c2a0f5f419a9a",
  "userId": "idcqa",
  "orgId": "appdev",
  "tokenType": "nonfungible",
  "noOfNfts": 0
}
getUserByAccountId
此方法會傳回指定帳戶的使用者詳細資訊。任何使用者都可以呼叫這個方法。
@GetMethod()
@Validator(yup.string())
public async getUserByAccountId(accountId: string) {
    return await this.Ctx.ERC721Account.getUserByAccountId(accountId);
}
參數:
  • accountId: string - 帳戶的 ID。
傳回值:
  • 成功時,使用者詳細資訊 (orgIduserId) 的 JSON 物件。
傳回值範例:
{
  "userId": "admin",
  "orgId": "Org1MSP"
}
getAccountHistory
此方法會傳回指定使用者的帳戶歷史記錄。這是非同步方法。此方法只能由鏈碼的 Token Admin 或帳戶擁有者呼叫。
@GetMethod()
@Validator(yup.string(), yup.string())
public async getAccountHistory(orgId: string, userId: string) {
    const accountId = await this.Ctx.ERC721Account.generateAccountId(orgId, userId);
    await this.Ctx.ERC721Auth.checkAuthorization('ERC721ACCOUNT.history', 'TOKEN', { accountId });
    return await this.Ctx.ERC721Account.history(accountId);
}
參數:
  • orgId: string - 目前組織中使用者的成員服務提供者 (MSP) ID。
  • userId: string - 使用者的使用者名稱或電子郵件 ID。
傳回值:
  • 成功時,帳戶歷史記錄的 JSON 物件。bapAccountVersion 參數定義於帳戶物件中供內部使用。
傳回值範例:
[
    {
        "trxId": "6ffd0d94f234c12444a5d5aa559563b59dff4d2280b573fea956dc632bdaf5d4",
        "timeStamp": 1649151044,
        "value": {
            "assetType": "oaccount",
            "bapAccountVersion" : 5,
            "accountId": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
            "userId": "admin",
            "orgId": "Org1MSP",
            "tokenType": "nonfungible",
            "noOfNfts": 1
        }
    },
    {
        "trxId": "a605f1fa62e511c2945fce5437f983a5e70ec814b82520d3ecd2d81e3ecf53a3",
        "timeStamp": 1649151022,
        "value": {
            "assetType": "oaccount",
            "bapAccountVersion" : 4,
            "accountId": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
            "userId": "admin",
            "orgId": "Org1MSP",
            "tokenType": "nonfungible",
            "noOfNfts": 2
        }
    },
    {
        "trxId": "ca4c07bf04240345de918cbf1f4f3da4b4d0ab044c5b8bea94343e427d9ed4e7",
        "timeStamp": 1649150910,
        "value": {
            "assetType": "oaccount",
            "bapAccountVersion" : 3,
            "accountId": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
            "userId": "admin",
            "orgId": "Org1MSP",
            "tokenType": "nonfungible",
            "noOfNfts": 1
        }
    },
    {
        "trxId": "cfb52ffc8c34c7fd86210fcf8c5f53d9f92a056c45ed3a33671d638020c1f9cb",
        "timeStamp": 1649149545,
        "value": {
            "assetType": "oaccount",
            "bapAccountVersion" : 2,
            "accountId": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
            "userId": "admin",
            "orgId": "Org1MSP",
            "tokenType": "nonfungible",
            "noOfNfts": 0
        }
    },
    {
        "trxId": "e7747b3001a170f88688620956320e9402e1dd8edad8afb4818a08a34647337c",
        "timeStamp": 1649147442,
        "value": {
            "assetType": "oaccount",
            "bapAccountVersion" : 1,
            "accountId": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
            "userId": "admin",
            "orgId": "Org1MSP",
            "tokenType": "nonfungible",
            "noOfNfts": 1
        }
    },
    {
        "trxId": "d2d1f9c898707ae831e9361bc25da6369eac37b10c87dc04d18d6f3808222f08",
        "timeStamp": 1649137534,
        "value": {
            "assetType": "oaccount",
            "bapAccountVersion" : 0,
            "accountId": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
            "userId": "admin",
            "orgId": "Org1MSP",
            "tokenType": "nonfungible",
            "noOfNfts": 0
        }
    }
]

角色管理方法

addRole
這個方法會將角色新增至指定的使用者。鏈碼的 Token Admin 只能呼叫此方法。
@Validator(yup.string(), yup.string(), yup.string())
public async addRole(role: string, orgId: string, userId: string) {
   const accountId = await this.Ctx.ERC721Account.generateAccountId(orgId, userId);
   await this.Ctx.ERC721Auth.checkAuthorization('ERC721TOKEN.addRoleMember', 'TOKEN');
   return await this.Ctx.ERC721Token.addRoleMember(role, accountId);
}
參數:
  • role: string - 要新增至指定使用者的角色名稱。mintableburnable 行為對應至規格檔案的 minter_role_nameburner_role_name 特性。
  • orgId: string - 目前組織中使用者的成員服務提供者 (MSP) ID。
  • userId: string - 使用者的使用者名稱或電子郵件 ID。
傳回值:
  • 成功時,會出現含有帳戶詳細資訊的訊息。
傳回值範例:
{"msg": "Successfully added role 'minter' to Account Id: oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d (Org-Id: Org1MSP, User-Id: admin)"}
removeRole
此方法會從指定的使用者移除角色。鏈碼的 Token Admin 只能呼叫此方法。
@Validator(yup.string(), yup.string(), yup.string())
public async removeRole(role: string, orgId: string, userId: string) {
    const accountId = await this.Ctx.ERC721Account.generateAccountId(orgId, userId);
    await this.Ctx.ERC721Auth.checkAuthorization('ERC721TOKEN.removeRoleMember', 'TOKEN');
    return await this.Ctx.ERC721Token.removeRoleMember(role, accountId);
}
參數:
  • role: string - 要從指定使用者移除的角色名稱。mintableburnable 行為對應至規格檔案的 minter_role_nameburner_role_name 特性。
  • orgId: string - 目前組織中使用者的成員服務提供者 (MSP) ID。
  • userId: string - 使用者的使用者名稱或電子郵件 ID。
傳回值:
  • 成功時,會出現含有帳戶詳細資訊的訊息。
傳回值範例:
{"msg": "Successfully removed role 'minter' from Account Id: oaccount~ec32cff8635a056f3dda3da70b1d6090d61f66c6a170c4a95fd008181f729dba (Org-Id: Org1MSP, User-Id: user1)"}
getAccountsByRole
此方法會傳回指定角色的所有帳戶 ID 清單。鏈碼的 Token Admin 只能呼叫此方法。
@GetMethod()
@Validator(yup.string())
public async getAccountsByRole(role: string) {
    await this.Ctx.ERC721Auth.checkAuthorization('ERC721ROLE.getAccountsByRole', 'TOKEN');
    return await this.Ctx.ERC721Role.getAccountsByRole(role);
}
參數:
  • role: string - 要搜尋的角色名稱。
傳回值:
  • 成功時,帳戶 ID 的 JSON 陣列。
傳回值範例:
{
    "accounts": [
        "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d"
    ]
}
getUsersByRole
此方法會傳回指定角色的所有使用者清單。鏈碼的 Token Admin 只能呼叫此方法。
@GetMethod()
@Validator(yup.string())
public async getUsersByRole(role: string) {
    await this.Ctx.ERC721Auth.checkAuthorization('ERC721ROLE.getUsersByRole', 'TOKEN');
    return await this.Ctx.ERC721Role.getUsersByRole(role);
}
參數:
  • role: string - 要搜尋的角色名稱。
傳回值:
  • 成功時,使用者物件的 JSON 陣列 (orgIduserId)。
傳回值範例:
{
    "users": [
        {
            "userId": "admin",
            "orgId": "Org1MSP"
        }
    ]
}
isInRole
此方法會傳回布林值,指示使用者是否具有指定的角色。此方法只能由鏈碼的 Token Admin 或帳戶的 Account Owner 呼叫。
@GetMethod()
@Validator(yup.string(), yup.string(), yup.string())
public async isInRole(orgId: string, userId: string, role: string) {
    const accountId = await this.Ctx.ERC721Account.generateAccountId(orgId, userId);
    await this.Ctx.ERC721Auth.checkAuthorization('ERC721TOKEN.isInRole', 'TOKEN',{ accountId });
    return { result: await this.Ctx.ERC721Token.isInRole(role, accountId) };
}
參數:
  • orgId: string - 目前組織中使用者的成員服務提供者 (MSP) ID。
  • userId: string - 使用者的使用者名稱或電子郵件 ID。
  • role: string - 要搜尋的角色名稱。
傳回值:
  • 成功時,布林結果的 JSON 字串。
傳回值範例:
{"result":"true"}

交易歷史記錄管理的方法

getAccountTransactionHistory
此方法會傳回指定使用者的帳戶交易歷史記錄。這是非同步方法。此方法只能由鏈碼的 Token Admin 或帳戶擁有者呼叫。
@GetMethod()
@Validator(yup.string(), yup.string())
public async getAccountTransactionHistory(orgId: string, userId: string) {
    const accountId = await this.Ctx.ERC721Account.generateAccountId(orgId, userId);
    await this.Ctx.ERC721Auth.checkAuthorization('ERC721ACCOUNT.getAccountTransactionHistory', 'TOKEN', { accountId });
    return await this.Ctx.ERC721Account.getAccountTransactionHistory(accountId)
}
參數:
  • orgId: string - 目前組織中使用者的成員服務提供者 (MSP) ID。
  • userId: string - 使用者的使用者名稱或電子郵件 ID。
傳回值範例:
[
    {
        "transactionId": "otransaction~6ffd0d94f234c12444a5d5aa559563b59dff4d2280b573fea956dc632bdaf5d4",
        "timestamp": "2022-04-05T09:30:44.000Z",
        "tokenId": "monalisa1",
        "noOfNfts": 1,
        "transactedAccount": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
        "transactionType": "BURN"
    },
    {
        "transactionId": "otransaction~a605f1fa62e511c2945fce5437f983a5e70ec814b82520d3ecd2d81e3ecf53a3",
        "timestamp": "2022-04-05T09:30:22.000Z",
        "tokenId": "monalisa1",
        "transactedAccount": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
        "transactionType": "MINT"
    },
    {
        "transactionId": "otransaction~ca4c07bf04240345de918cbf1f4f3da4b4d0ab044c5b8bea94343e427d9ed4e7",
        "timestamp": "2022-04-05T09:28:30.000Z",
        "tokenId": "monalisa",
        "transactedAccount": "oaccount~ec32cff8635a056f3dda3da70b1d6090d61f66c6a170c4a95fd008181f729dba",
        "transactionType": "CREDIT"
    },
    {
        "transactionId": "otransaction~cfb52ffc8c34c7fd86210fcf8c5f53d9f92a056c45ed3a33671d638020c1f9cb",
        "timestamp": "2022-04-05T09:05:45.000Z",
        "tokenId": "monalisa",
        "transactedAccount": "oaccount~ec32cff8635a056f3dda3da70b1d6090d61f66c6a170c4a95fd008181f729dba",
        "transactionType": "DEBIT"
    },
    {
        "transactionId": "otransaction~e7747b3001a170f88688620956320e9402e1dd8edad8afb4818a08a34647337c",
        "timestamp": "2022-04-05T08:30:42.000Z",
        "tokenId": "monalisa",
        "transactedAccount": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
        "transactionType": "MINT"
    }
]
getAccountTransactionHistoryWithFilters
此方法會傳回指定使用者的帳戶交易歷史記錄,依 PageSizeBookmarkstartTimeendTime 篩選。這是非同步方法。連線至遠端 Oracle Blockchain Platform 網路時才能呼叫此方法。此方法只能由鏈碼的 Token Admin 或帳戶擁有者呼叫。
@GetMethod()
@Validator(yup.string(), yup.string(), yup.object().nullable())
public async getAccountTransactionHistoryWithFilters(orgId: string, userId: string, filters ?: Filters) {
    const accountId = await this.Ctx.ERC721Account.generateAccountId(orgId, userId);
    await this.Ctx.ERC721Auth.checkAuthorization('ERC721ACCOUNT.getAccountTransactionHistoryWithFilters', 'TOKEN', { accountId });
    return await this.Ctx.ERC721Account.getAccountTransactionHistoryWithFilters(accountId, filters)
}
參數:
  • orgId: string - 目前組織中使用者的成員服務提供者 (MSP) ID。
  • userId: string - 使用者的使用者名稱或電子郵件 ID。
  • filters: object - 包含四個屬性的 Filter 類別物件:pageSizebookmarkstartTimeendTime
傳回值範例:
[
    {
        "transactionId": "otransaction~6ffd0d94f234c12444a5d5aa559563b59dff4d2280b573fea956dc632bdaf5d4",
        "timestamp": "2022-04-05T09:30:44.000Z",
        "tokenId": "monalisa1",
        "transactedAccount": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
        "transactionType": "BURN"
    },
    {
        "transactionId": "otransaction~a605f1fa62e511c2945fce5437f983a5e70ec814b82520d3ecd2d81e3ecf53a3",
        "timestamp": "2022-04-05T09:30:22.000Z",
        "tokenId": "monalisa1",
        "transactedAccount": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
        "transactionType": "MINT"
    },
    {
        "transactionId": "otransaction~ca4c07bf04240345de918cbf1f4f3da4b4d0ab044c5b8bea94343e427d9ed4e7",
        "timestamp": "2022-04-05T09:28:30.000Z",
        "tokenId": "monalisa",
        "transactedAccount": "oaccount~ec32cff8635a056f3dda3da70b1d6090d61f66c6a170c4a95fd008181f729dba",
        "transactionType": "CREDIT"
    },
    {
        "transactionId": "otransaction~cfb52ffc8c34c7fd86210fcf8c5f53d9f92a056c45ed3a33671d638020c1f9cb",
        "timestamp": "2022-04-05T09:05:45.000Z",
        "tokenId": "monalisa",
        "transactedAccount": "oaccount~ec32cff8635a056f3dda3da70b1d6090d61f66c6a170c4a95fd008181f729dba",
        "transactionType": "DEBIT"
    },
    {
        "transactionId": "otransaction~e7747b3001a170f88688620956320e9402e1dd8edad8afb4818a08a34647337c",
        "timestamp": "2022-04-05T08:30:42.000Z",
        "tokenId": "monalisa",
        "transactedAccount": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
        "transactionType": "MINT"
    }
]
getTransactionById
此方法會傳回指定異動 ID 的異動記錄。這是非同步方法。此方法只能由鏈碼的 Token Admin 或帳戶擁有者呼叫。
@GetMethod()
@Validator(yup.string())
public async getTransactionById(transactionId: string) {
    return await this.Ctx.ERC721Transaction.getTransactionById(transactionId);
}
參數:
  • transactionId: string - 交易的 ID,即前置碼 otransaction~,後面接著 64 位元雜湊 (十六進位格式)。
傳回值範例:
{
    "transactionId": "otransaction~6ffd0d94f234c12444a5d5aa559563b59dff4d2280b573fea956dc632bdaf5d4",
    "history": [
        {
            "trxId": "6ffd0d94f234c12444a5d5aa559563b59dff4d2280b573fea956dc632bdaf5d4",
            "timeStamp": 1649151044,
            "value": {
                "assetType": "otransaction",
                "transactionId": "otransaction~6ffd0d94f234c12444a5d5aa559563b59dff4d2280b573fea956dc632bdaf5d4",
                "tokenId": "monalisa1",
                "fromAccountId": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
                "toAccountId": "",
                "triggeredByAccountId": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
                "transactionType": "BURN",
                "timestamp": "2022-04-05T09:30:44.000Z",
            }
        }
    ]
}
deleteHistoricalTransactions
此方法會刪除狀態資料庫中超過指定時戳的交易。這是非同步方法。鏈碼的 Token Admin 只能呼叫此方法。
@Validator(yup.date())
public async deleteHistoricalTransactions(timeToExpiration: Date) {
    await this.Ctx.ERC721Auth.checkAuthorization('ERC721TRANSACTION.deleteTransactions', 'TOKEN');
    return await this.Ctx.ERC721Transaction.deleteTransactions(timeToExpiration);
}
參數:
  • timestamp: string - 時戳。將會刪除時間戳記之前的所有交易。
傳回值範例:
{
    "msg": "Successfuly deleted transaction older than date: Thu Apr 07 2022 21:18:59 GMT+0000 (Coordinated Universal Time).",
    "transactions": [
        "otransaction~30513757d8b647fffaafac440d743635f5c1b2e41b25ebd6b70b5bbf78a2643f",
        "otransaction~ac0e908c735297941ba58bb208ee61ff4816a1e54c090d68024f82adf743892b"
    ]
}

記號行為管理方法 - 可調整行為

create<Token Name>Token
此方法會建立 (提示) NFT。資產和關聯的特性會儲存在狀態資料庫中。此交易的呼叫者必須具有權杖帳戶。此交易的呼叫者會成為 NFT 的擁有者。如果記號設定檔案包含 behaviorsroles 區段和 rolesminter_role_name 特性,則交易的呼叫者必須具有較小的角色。否則,任何呼叫者都可以提示 NFT。
@Validator(< Token Class >)
public async create< Token Name >Token(tokenAsset: <Token Class>) {
    return await this.Ctx.ERC721Token.createToken(tokenAsset);
}
參數:
  • tokenAsset: <Token Class> - 要加密的記號資產。如需有關記號資產特性的詳細資訊,請參閱輸入規格檔案。
傳回值:
  • 成功時,包含下列特性的 JSON 權杖資產物件:
  • metadata - 描述權杖的 JSON 資訊。
  • createdBy - 呼叫交易來提示記號之使用者的帳戶 ID。
  • creationDate - 交易的時戳。
  • isBurned - 表示是否耗用以 tokenId 識別之 NFT 的布林值。
  • tokenName - 記號的名稱。
  • tokenDesc - 記號的描述。
  • symbol - 記號的符號。
  • tokenStandard - 記號的標準。
  • tokenType - 此帳戶持有的權杖類型。
  • tokenUnit - 記號的單位。
  • behaviors - 所有記號行為的描述。
  • mintable - 可調整行為特性的描述。max_mint_quantity 特性指定可建立之此記號類別的 NFT 數目上限。
  • owner - 記號目前擁有者的帳戶 ID。在進行微調程序時,此方法的呼叫程式會成為記號的擁有者。
  • tokenUri - 記號的 URI。
傳回值範例:
{
    "metadata": {
        "painting_name": "Mona_Lisa",
        "description": "Mona Lisa Painting",
        "image": "monalisa.jpeg",
        "painter_name": "Leonardo_da_Vinci"
    },
    "assetType": "otoken",
    "tokenId": "monalisa",
    "tokenName": "artcollection",
    "tokenDesc": "token description",
    "symbol": "ART",
    "tokenStandard": "erc721+",
    "tokenType": "nonfungible",
    "tokenUnit": "whole",
    "behaviors": [
        "indivisible",
        "singleton",
        "mintable",
        "transferable",
        "burnable",
        "roles"
    ],
    "roles": {
        "minter_role_name": "minter"
    },
    "mintable": {
        "max_mint_quantity": 20000
    },
    "owner": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
    "createdBy": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
    "creationDate": "2022-04-05T08:30:42.000Z",
    "isBurned": false,
    "tokenUri": "\"https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg\"",
    "price": 100,
    "on_sale_flag": false
}
update<Token Name>Token
此方法會更新記號特性。只有權杖的擁有者或建立者可以呼叫此方法。建立權杖資產之後,只有權杖擁有者可以更新權杖自訂特性。如果使用者同時是權杖擁有者和權杖建立者,他們也可以更新 TokenDesc 特性。無法更新記號描述資料。您必須將所有記號特性傳遞至此方法,即使您只想要更新特定特性也一樣。
@Validator(<Token Class>)
public async update<Token name>Token(tokenAsset: <Token Class>) {
    return await this.Ctx.ERC721Token.updateToken(tokenAsset);
}
參數:
  • tokenAsset: <Token Class> - 要更新的記號資產。如需有關記號資產特性的詳細資訊,請參閱輸入規格檔案。
傳回值:
  • 成功時,更新的 JSON 權杖資產物件
傳回值範例:
{
    "metadata": {
        "painting_name": "Mona_Lisa",
        "description": "Mona Lisa Painting",
        "image": "monalisa.jpeg",
        "painter_name": "Leonardo_da_Vinci"
    },
    "assetType": "otoken",
    "tokenId": "monalisa",
    "tokenName": "artcollection",
    "tokenDesc": "token description",
    "symbol": "ART",
    "tokenStandard": "erc721+",
    "tokenType": "nonfungible",
    "tokenUnit": "whole",
    "behaviors": [
        "indivisible",
        "singleton",
        "mintable",
        "transferable",
        "burnable",
        "roles"
    ],
    "roles": {
        "minter_role_name": "minter"
    },
    "mintable": {
        "max_mint_quantity": 20000
    },
    "owner": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
    "createdBy": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
    "creationDate": "2022-04-05T08:30:42.000Z",
    "isBurned": false,
    "tokenUri": "https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg",
    "price": 100,
    "on_sale_flag": true
}

記號行為管理方法 - 可傳輸行為

safeTransferFrom
這是非同步函數。此方法會將指定 NFT 的所有權從呼叫程式轉移到另一個帳戶。此方法包含下列驗證:
  • 記號存在且未被燒錄。
  • 寄件者帳戶與接收者帳戶存在且不是相同帳戶。
  • 寄件者帳戶擁有權杖。
  • 函數的呼叫者是寄件者。
@Validator(yup.string(), yup.string(), yup.string(), yup.string(), yup.string(), yup.string().max(2000))
public async safeTransferFrom(fromOrgId: string, fromUserId: string, toOrgId: string, toUserId: string, tokenId: string, data?: string) {
    const tokenAsset = await this.getTokenObject(tokenId);
    const fromAccountId = await this.Ctx.ERC721Account.generateAccountId(fromOrgId, fromUserId);
    const toAccountId = await this.Ctx.ERC721Account.generateAccountId(toOrgId, toUserId);
    return await this.Ctx.ERC721Token.safeTransferFrom(fromAccountId, toAccountId, tokenAsset, data);
}
參數:
  • fromOrgId: string - 目前組織中寄件者與記號擁有者的成員服務提供者 (MSP) ID。
  • fromUserId: string - 寄件者與記號擁有者的使用者名稱或電子郵件 ID。
  • toOrgId: string - 目前組織中接收者的成員服務提供者 (MSP) ID。
  • toUserId: string - 接收者的使用者名稱或電子郵件 ID。
  • tokenId: string - 要傳輸的記號 ID。
  • data: string - 儲存在交易記錄中的選擇性其他資訊。
傳回值:
  • 成功時,包含寄件者與接收者帳戶明細的訊息。
傳回值範例:
{"msg": "Successfully transferred NFT token: 'monalisa' from Account-Id: oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d (Org-Id: Org1MSP, User-Id: admin) to Account-Id: oaccount~ec32cff8635a056f3dda3da70b1d6090d61f66c6a170c4a95fd008181f729dba (Org-Id: Org1MSP, User-Id: user1)"}
transferFrom
這是非同步函數。此方法會將指定 NFT 的所有權從寄件者帳戶轉移至接收者帳戶。呼叫者必須負責傳送正確的參數。任何使用者都可以呼叫此方法,而不只是記號擁有者。此方法包含下列驗證:
  • 記號存在且未被燒錄。
  • 寄件者帳戶與接收者帳戶存在且不是相同帳戶。
  • 寄件者帳戶擁有權杖。
@Validator(yup.string(), yup.string(), yup.string(), yup.string(), yup.string())
public async transferFrom(fromOrgId: string, fromUserId: string, toOrgId: string, toUserId: string, tokenId: string) {
    const tokenAsset = await this.getTokenObject(tokenId);
    const fromAccountId = await this.Ctx.ERC721Account.generateAccountId(fromOrgId, fromUserId);
    const toAccountId = await this.Ctx.ERC721Account.generateAccountId(toOrgId, toUserId);
    return await this.Ctx.ERC721Token.transferFrom(fromAccountId, toAccountId, tokenAsset);
}
參數:
  • fromOrgId: string - 目前組織中寄件者的成員身分服務提供者 (MSP) ID。
  • fromUserId: string - 寄件者的使用者名稱或電子郵件 ID。
  • toOrgId: string - 目前組織中接收者的成員服務提供者 (MSP) ID。
  • toUserId: string - 接收者的使用者名稱或電子郵件 ID。
  • tokenId: string - 要傳輸的記號 ID。
傳回值:
  • 成功時,包含寄件者與接收者帳戶明細的訊息。
傳回值範例:
{"msg": "Successfully transferred NFT token: 'monalisa' from Account-Id: oaccount~ec32cff8635a056f3dda3da70b1d6090d61f66c6a170c4a95fd008181f729dba (Org-Id: Org1MSP, User-Id: user1) to Account-Id: oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d (Org-Id: Org1MSP, User-Id: admin)"}

記號行為管理方法 - 可燒錄行為

burn
此方法會從來電者的帳戶停用或燒錄指定的 NFT。這個方法的呼叫程式必須要有一個帳戶。除非記號規格檔案包含 burnable 行為,否則無法燒錄記號。如果規格檔案的 roles 區段中未指定 burner_role_name 特性,則記號的擁有者可燒錄記號。如果在 roles 區段中指定了 burner_role_name 特性,則被指派燃燒者角色的使用者,同時也是記號的礦工 (建立者) 或擁有者可燒錄記號。
@Validator(yup.string())
public async burn(tokenId: string) {
    const tokenAsset = await this.getTokenObject(tokenId);
    return await this.Ctx.ERC721Token.burn(tokenAsset);
}
參數:
  • tokenId: string - 要燒錄的記號 ID。
傳回值:
  • 成功時,會出現含有帳戶詳細資訊的訊息。
傳回值範例:
{"msg": "Successfully burned NFT token: 'monalisa1' from Account-Id: oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d (Org-Id: Org1MSP, User-Id: admin)"}
burnNFT
此方法會從呼叫者的帳戶停用或燒錄指定的 NFT,並傳回記號物件和記號歷史記錄。這個方法的呼叫程式必須要有一個帳戶。除非記號規格檔案包含 burnable 行為,否則無法燒錄記號。如果規格檔案的 roles 區段中未指定 burner_role_name 特性,則記號的擁有者可燒錄記號。如果在 roles 區段中指定了 burner_role_name 特性,則被指派燃燒者角色的使用者,同時也是記號的礦工 (建立者) 或擁有者可燒錄記號。
@Validator(yup.string())
public async burnNFT(tokenId: string) {
    const token = await this.Ctx.ERC721Token.get(tokenId)
    if (token.isBurned === true) {
      throw new Error(`token with tokenId ${tokenId} is already burned`);
    }
    const tokenHistory = await this.Ctx.ERC721Token.history(tokenId);
    await this.burn(tokenId);
    token.tokenId = parseInt(token.tokenId);
    if(Number.isNaN(token.tokenId)) {
      throw new Error(`tokenId is expected to be integer but found ${tokenId}`)
    }
    token.isBurned = true;
    return {...token, tokenHistory: JSON.stringify(tokenHistory)};
}
參數:
  • tokenId: string - 要燒錄的記號 ID。
傳回值:
  • 成功時,包含記號歷史記錄資訊的記號物件。
傳回值範例:
{
    "assetType": "otoken",
    "tokenId": 1,
    "tokenName": "artcollection",
    "symbol": "ART",
    "tokenStandard": "erc721+",
    "tokenType": "nonfungible",
    "tokenUnit": "whole",
    "behaviors": [
        "indivisible",
        "singleton",
        "mintable",
        "transferable",
        "burnable",
        "roles"
    ],
    "roles": {
        "minter_role_name": "minter"
    },
    "mintable": {
        "max_mint_quantity": 20000
    },
    "createdBy": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
    "creationDate": "2023-08-22T07:36:50.000Z",
    "owner": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
    "isBurned": true,
    "tokenUri": "example.com",
    "price": 120,
    "on_sale_flag": false,
    "tokenHistory": "[{\"trxId\":\"732438a85b5e8fc76c5254e54602b29d583543b103fafb5a28c0df384428bb50\",\"timeStamp\":\"2023-08-22T07:36:50.000Z\",\"value\":{\"assetType\":\"otoken\",\"tokenId\":\"1\",\"tokenName\":\"artcollection\",\"symbol\":\"ART\",\"tokenStandard\":\"erc721+\",\"tokenType\":\"nonfungible\",\"tokenUnit\":\"whole\",\"behaviors\":[\"indivisible\",\"singleton\",\"mintable\",\"transferable\",\"burnable\",\"roles\"],\"roles\":{\"minter_role_name\":\"minter\"},\"mintable\":{\"max_mint_quantity\":20000},\"createdBy\":\"oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d\",\"creationDate\":\"2023-08-22T07:36:50.000Z\",\"owner\":\"oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d\",\"isBurned\":false,\"tokenUri\":\"example.com\",\"price\":120,\"on_sale_flag\":false}}]"
}

自訂方法

您可以使用記號 SDK 方法,為商業應用程式撰寫自訂方法。

下列範例顯示如何在自訂方法中使用記號 SDK 方法。呼叫 sell 方法時,它會針對指定的價格張貼銷售記號。

@Validator(yup.string(), yup.number())
public async sell(token_id: string, selling_price: number) {
    try { 
        const token = await this.Ctx.ERC721Token.get(token_id);
        const t = new ArtCollection(token)
 /**  * price is a custom asset
      attribute to set the price of a non-fungible token in the
      marketplace  */
        t.price =  selling_price;
 /**  * on_sale_flag is a
      custom asset attribute that maintains non-fungible token selling status in the
      marketplace  */
        t.on_sale_flag = true;
        await this.Ctx.ERC721Token.updateToken(t);
        let msg = `Token ID : '${token_id}' has been posted for selling in the marketplace'`;
        return {msg}
        } catch(error) {
            throw new Error(error.message);
    }
}

NFT SDK 方法

存取控制管理的方法

NFT SDK 提供存取控制功能。部分方法只能由記號的 Token AdminAccount Owner 呼叫。您可以使用此功能來確保作業只由預期的使用者執行。任何未經授權的存取都會導致錯誤。若要使用存取控制功能,請從 ../lib/erc721-auth 模組匯入 Authorization 類別。
import { ERC721Authorization } from '../lib/erc721-auth';
checkAuthorization
您可以使用此方法將存取控制檢查新增至作業。這是非同步函數。大多數自動產生的方法都包含存取控制。某些記號方法只能由記號的 ERC721AdminAccount Owner 執行,或由具有多個帳戶的使用者的 MultipleAccountOwner 執行。checkAuthorization 方法是 Authorization 類別的一部分,您可以透過 Ctx 物件存取此類別。存取控制對應會在 ../lib/constant.ts 檔案中描述,如下列文字所示。您可以編輯 ../lib/constant.ts 檔案來修改存取控制。若要使用您自己的存取控制或停用存取控制,請從自動產生的控制器方法與自訂方法移除存取控制程式碼。
export const TOKENACCESS = {
  ADMIN: {
    isUserTokenAdmin: ['Admin', 'MultipleAccountOwner'],
    addAdmin: ['Admin'],
    removeAdmin: ['Admin'],
    getAllAdmins: ['Admin'],
  },
  TOKEN: {
    save: ['Admin'],
    getAllTokens: ['Admin'],
    get: ['Admin'],
    update: ['Admin'],
    getDecimals: ['Admin'],
    getTokensByName: ['Admin'],
    addRoleMember: ['Admin'],
    removeRoleMember: ['Admin'],
    isInRole: ['Admin', 'AccountOwner'],
    getTotalMintedTokens: ['Admin'],
    getNetTokens: ['Admin'],
  },
  ROLE: {
    getAccountsByRole: ['Admin'],
    getUsersByRole: ['Admin'],
  },
  TRANSACTION: {
    deleteTransactions: ['Admin'],
  },
  ACCOUNT: {
    createAccount: ['Admin'],
    getAllAccounts: ['Admin'],
    getAccountsByUser: ['Admin', 'MultipleAccountOwner'],
    getAccount: ['Admin', 'AccountOwner'],
    history: ['Admin', 'AccountOwner'],
    getAccountTransactionHistory: ['Admin', 'AccountOwner'],
    getAccountBalance: ['Admin', 'AccountOwner'],
    getAccountOnHoldBalance: ['Admin', 'AccountOwner'],
    getOnHoldIds: ['Admin', 'AccountOwner'],
  },
  ERC721ADMIN: {
    isUserTokenAdmin: ['Admin'],
    addAdmin: ['Admin'],
    removeAdmin: ['Admin'],
    getAllAdmins: ['Admin'],
  }, 
  ERC721TOKEN: {
    getAllTokens: ['Admin'],
    getAllTokensByUser: ['Admin', 'AccountOwner'],
    get: ['Admin', TOKEN_OWNER],
    getTokensByName: ['Admin'],
    addRoleMember: ['Admin'],
    removeRoleMember: ['Admin'],
    isInRole: ['Admin', 'AccountOwner'],
    totalSupply: ['Admin'],
    totalNetSupply: ['Admin'],
    history: ['Admin'],
  },
  ERC721ROLE: {
    getAccountsByRole: ['Admin'],
    getUsersByRole: ['Admin'],
  },
  ERC721TRANSACTION: {
    deleteTransactions: ['Admin'],
  },
  ERC721ACCOUNT: {
    createAccount: ['Admin'],
    getAllAccounts: ['Admin'],
    getAccountsByUser: ['Admin', 'MultipleAccountOwner'],
    history: ['Admin', 'AccountOwner'],
    getAccountTransactionHistory: ['Admin', 'AccountOwner'],
    getAccountTransactionHistoryWithFilters: ['Admin', 'AccountOwner'],
    balanceOf: ['Admin', 'MultipleAccountOwner'],
  }
}
Ctx.ERC721Auth.checkAuthorization(classFuncName: string, ...args)
參數:
  • classFuncName: string - 類別與方法之間的對應值,如 ../lib/constant.ts 檔案中所述。
  • ...args - 一個變數引數,其中 args[0] 會採用 'TOKEN' 常數,而 args[1] 會採用 accountId 參數來新增 AccountOwner 的存取控制檢查。若要新增 MultipleAccountOwner 的存取控制檢查,args[1] 會採用 orgId 參數,而 args[2] 則會採用 userId 參數。
傳回值:
  • 成功時,即是承諾。發生錯誤時,拒絕並顯示錯誤訊息。
範例:

Admin 存取

await this.Ctx.ERC721Auth.checkAuthorization('ADMIN.addAdmin', 'TOKEN');

AccountOwner 存取

await this.Ctx.ERC721Auth.checkAuthorization('ACCOUNT.getAccountBalance', 'TOKEN', accountId);

MultipleAccountOwner 存取

await this.Ctx.ERC721Auth.checkAuthorization('ADMIN.isUserTokenAdmin', 'TOKEN', orgId, userId);
isUserTokenAdmin
如果函數的呼叫程式是 Token Admin,此方法會傳回布林值 true。否則,方法會傳回 false。這是非同步靜態函數。
Ctx.ERC721Auth.isUserTokenAdmin(orgId: string, userId: string)
參數:
  • orgId - 目前網路組織中使用者的成員服務提供者 (MSP) ID。
  • userId - 使用者的使用者名稱或電子郵件 ID。
傳回值:
  • 如果發生錯誤,則為布林回應與錯誤訊息。
範例:

await this.Ctx.Auth.isUserTokenAdmin('Org1MSP', 'user1');

{"result":false}
addAdmin
此方法會將使用者新增為記號鏈碼的 Token Admin
Ctx.ERC721Admin.addAdmin(orgId: string, userId: string)
參數:
  • orgId: string - 目前組織中使用者的成員服務提供者 (MSP) ID。
  • userId: string - 使用者的使用者名稱或電子郵件 ID。
傳回值:
  • 成功時,會列出新增為記號鏈碼之 Token Admin 的使用者詳細資訊的訊息。發生錯誤時,包含錯誤訊息的非零錯誤物件。
範例:

await this.Ctx.ERC721Admin.addAdmin(orgId, userId)

{"msg": "Successfully added Admin (orgId: Org1MSP, userId: user1)"}
removeAdmin
此方法會將使用者移除為記號鏈碼的 Token Admin
Ctx.ERC721Admin.removeAdmin(orgId: string, userId: string)
參數:
  • orgId: string - 目前組織中使用者的成員服務提供者 (MSP) ID。
  • userId: string - 使用者的使用者名稱或電子郵件 ID。
傳回值:
  • 成功時,會出現一則訊息,其中列出使用者的詳細資訊,已移除為記號鏈碼的 Token Admin。發生錯誤時,包含錯誤訊息的非零錯誤物件。
範例:

await this.Ctx.ERC721Admin.RemoveAdmin(orgId, userId)

{"msg": "Successfully removed Admin (orgId: Org1MSP, userId: user1)"}
getAllAdmins
此方法會傳回所有 Token Admin 使用者的清單。
Ctx.ERC721Admin.getAllAdmins()
參數:
傳回值:
  • 成功時,所有 Token Admin 使用者的清單。發生錯誤時,包含錯誤訊息的非零錯誤物件。
範例:

await this.Ctx.ERC721Admin.getAllAdmins()

{
    "admins": [
        {
            "orgId": "Org1MSP",
            "userId": "admin"
        }
    ]
}

記號組態管理的方法

權杖組態管理方法是以 ERC-721 標準為基礎。若要使用記號組態管理方法,請從 ../lib/erc721-token 模組匯入 Token 類別。

totalSupply
此方法會傳回 Minted NFT 的總數。這是非同步函數。
Ctx.ERC721Token.totalSupply()
參數:
傳回值:
  • 成功時,數字資料類型的淨變數替代字總計。發生錯誤時,會傳回錯誤訊息。
範例:

await this.Ctx.ERC721Token.totalSupply(tokenAsset);

2000
get
此方法會傳回狀態資料庫中存在的指定記號物件。這是非同步靜態函數。
Ctx.ERC721Token.get(tokenId: string)
參數:
  • tokenId: string - 記號的 ID。
傳回值:
  • 成功時,包含權杖資產之 JSON 物件的承諾。發生錯誤時,拒絕並顯示錯誤訊息
範例:

await this.Ctx.ERC721Token.get(tokenId);

{
    "metadata": {
        "painting_name": "Mona_Lisa",
        "description": "Mona Lisa Painting",
        "image": "monalisa.jpeg",
        "painter_name": "Leonardo_da_Vinci"
    },
    "assetType": "otoken",
    "tokenId": "monalisa",
    "tokenName": "artcollection",
    "tokenDesc": "token description",
    "symbol": "ART",
    "tokenStandard": "erc721+",
    "tokenType": "nonfungible",
    "tokenUnit": "whole",
    "behaviors": [
        "indivisible",
        "singleton",
        "mintable",
        "transferable",
        "burnable",
        "roles"
    ],
    "roles": {
        "minter_role_name": "minter"
    },
    "mintable": {
        "max_mint_quantity": 20000
    },
    "owner": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
    "createdBy": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
    "transferredBy": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
    "creationDate": "2022-04-05T08:30:42.000Z",
    "transferredDate": "2022-04-05T09:28:30.000Z",
    "isBurned": false,
    "tokenUri": "https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg",
    "price": 100,
    "on_sale_flag": true
}
isTokenType
此方法指示是否有指定 ID 的權杖資產存在。這是非同步靜態函數。
Ctx.ERC721Token.isTokenType(tokenId: string)
參數:
  • tokenId: string - 記號的 ID。
傳回值:
  • 成功時,如果具有指定 ID 的權杖資產存在,則承諾為 true 。發生錯誤時,拒絕並顯示錯誤訊息。
範例:

await this.Ctx.ERC721Token.isTokenType(tokenId);

true
createToken
此方法會建立記號,並將其特性儲存在狀態資料庫中。只有具備較小角色的使用者才能呼叫此方法。這是非同步函數。
Ctx.ERC721Token.createToken(token: <Instance of Token Class>)
參數:
  • token: <Instance of Token Class> - 要建立的記號資產。
傳回值:
  • 成功時,含有權杖詳細資訊的承諾訊息。發生錯誤時,拒絕並顯示錯誤訊息。
範例:

await this.Ctx.ERC721Token.createToken(tokenAsset);

{
    "metadata": {
        "painting_name": "Mona_Lisa",
        "description": "Mona Lisa Painting",
        "image": "monalisa.jpeg",
        "painter_name": "Leonardo_da_Vinci"
    },
    "assetType": "otoken",
    "tokenId": "monalisa",
    "tokenName": "artcollection",
    "tokenDesc": "token description",
    "symbol": "ART",
    "tokenStandard": "erc721+",
    "tokenType": "nonfungible",
    "tokenUnit": "whole",
    "behaviors": [
        "indivisible",
        "singleton",
        "mintable",
        "transferable",
        "burnable",
        "roles"
    ],
    "roles": {
        "minter_role_name": "minter"
    },
    "mintable": {
        "max_mint_quantity": 20000
    },
    "owner": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
    "createdBy": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
    "creationDate": "2022-04-05T08:30:42.000Z",
    "isBurned": false,
    "tokenUri": "\"https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg\"",
    "price": 100,
    "on_sale_flag": false
}
updateToken
此方法會更新記號特性。此方法只能由權杖的擁有者或建立者呼叫。建立權杖資產之後,只有權杖擁有者可以更新權杖自訂特性。如果使用者同時是權杖擁有者和權杖建立者,他們也可以更新 TokenDesc 特性。無法更新記號描述資料。您必須將所有記號特性傳遞至此方法,即使您只想要更新特定特性也一樣。這是非同步函數。
Ctx.ERC721Token.updateToken(token: <Instance of Token Class>)
參數:
  • token: <Instance of Token Class> - 要更新的記號資產。
傳回值:
  • 成功時,含有權杖詳細資訊的承諾訊息。發生錯誤時,拒絕並顯示錯誤訊息。
範例:

await this.Ctx.ERC721Token.updateToken(tokenAsset)

{
    "metadata": {
        "painting_name": "Mona_Lisa",
        "description": "Mona Lisa Painting",
        "image": "monalisa.jpeg",
        "painter_name": "Leonardo_da_Vinci"
    },
    "assetType": "otoken",
    "tokenId": "monalisa",
    "tokenName": "artcollection",
    "tokenDesc": "token description",
    "symbol": "ART",
    "tokenStandard": "erc721+",
    "tokenType": "nonfungible",
    "tokenUnit": "whole",
    "behaviors": [
        "indivisible",
        "singleton",
        "mintable",
        "transferable",
        "burnable",
        "roles"
    ],
    "roles": {
        "minter_role_name": "minter"
    },
    "mintable": {
        "max_mint_quantity": 20000
    },
    "owner": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
    "createdBy": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
    "creationDate": "2022-04-05T08:30:42.000Z",
    "isBurned": false,
    "tokenUri": "https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg",
    "price": 100,
    "on_sale_flag": true
}
getByRange
此方法會在內部呼叫結構 getStateByRange 方法。即使從分類帳傳回任何具有指定 ID 的資產,此方法會將資產轉換成呼叫程式資產類型。這是非同步靜態函數。
@validator(yup.string(), yup.string())
public async getDigiCurrGetByRange(startId: string, endId: string) {
   return await this.Ctx.ERC721TOken.getByRange(startId, endId, PaintingNft);
}
Ctx.ERC721Token.getByRange(startId: string, endId: string, tokenClassReference?: <Instance of Token Class> )
參數:
  • startId: string - 範圍的開始索引鍵。此索引鍵包含在範圍內。
  • endId: string - 範圍的結束索引鍵。此索引鍵已從範圍中排除。
  • tokenClassReference: <Instance of Token Class> - 要操作的記號資產。
傳回值:
  • 成功時,陣列為 <Token Class> 的承諾。發生錯誤時,拒絕並顯示錯誤訊息。
傳回值範例:
[
  {
      "metadata":{
         "painting_name":"Mona_Lisa",
         "description":"Mona Lisa Painting",
         "image":"monalisa.jpeg",
         "painter_name":"Leonardo_da_Vinci"
      },
      "assetType":"otoken",
      "tokenId":"monalisa",
      "tokenName":"artcollection",
      "tokenDesc":"token description",
      "symbol":"ART",
      "tokenStandard":"erc721+",
      "tokenType":"nonfungible",
      "tokenUnit":"whole",
      "behaviors":[
         "indivisible",
         "singleton",
         "mintable",
         "transferable",
         "burnable",
         "roles"
      ],
      "roles":{
         "minter_role_name":"minter"
      },
      "mintable":{
         "max_mint_quantity":20000
      },
      "owner":"oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
      "createdBy":"oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
      "transferredBy":"oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
      "creationDate":"2022-04-05T08:30:42.000Z",
      "transferredDate":"2022-04-05T09:28:30.000Z",
      "isBurned":false,
      "tokenUri":"https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg",
      "price":100,
      "on_sale_flag":true
   }
]
history
此方法會傳回指定記號的歷史記錄。這是非同步靜態函數。
Ctx.ERC721Token.history(tokenId: string)
參數:
  • tokenId: string - 記號的 ID。
傳回值:
  • 成功時,指定記號的承諾歷史記錄查詢重複程式。發生錯誤時,拒絕並顯示錯誤訊息。
傳回值範例:
[
   {
      "trxId":"e17a3154d5271be0492cbc7c12390b3480fec5a792d1cb1083e5335de56ebbd9",
      "timeStamp":1622614032,
      "isDelete":false,
      "value":{
         "metadata":{
            "painting_name":"Mona_Lisa",
            "description":"Mona Lisa Painting",
            "image":"monalisa.jpeg",
            "painter_name":"Leonardo_da_Vinci"
         },
         "assetType":"otoken",
         "tokenId":"monalisa",
         "tokenName":"artcollection",
         "tokenDesc":"token description",
         "symbol":"ART",
         "tokenStandard":"erc721+",
         "tokenType":"nonfungible",
         "tokenUnit":"whole",
         "behaviors":[
            "indivisible",
            "singleton",
            "mintable",
            "transferable",
            "burnable",
            "roles"
         ],
         "roles":{
            "minter_role_name":"minter"
         },
         "mintable":{
            "max_mint_quantity":20000
         },
         "owner":"oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
         "createdBy":"oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
         "creationDate":"2022-04-05T08:30:42.000Z",
         "isBurned":false,
         "tokenUri":"https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg",
         "price":100,
         "on_sale_flag":"true"
      }
   },
   {
      "trxId":"dbcc4da410ad4d4a80996f090b313240f3f3d08aa2b5086afa8d0921f7b4c1e5",
      "timeStamp":1622643853,
      "isDelete":false,
      "value":{
         "metadata":{
            "painting_name":"Mona_Lisa",
            "description":"Mona Lisa Painting",
            "image":"monalisa.jpeg",
            "painter_name":"Leonardo_da_Vinci"
         },
         "assetType":"otoken",
         "tokenId":"monalisa",
         "tokenName":"artcollection",
         "tokenDesc":"token description",
         "symbol":"ART",
         "tokenStandard":"erc721+",
         "tokenType":"nonfungible",
         "tokenUnit":"whole",
         "behaviors":[
            "indivisible",
            "singleton",
            "mintable",
            "transferable",
            "burnable",
            "roles"
         ],
         "roles":{
            "minter_role_name":"minter"
         },
         "mintable":{
            "max_mint_quantity":20000
         },
         "owner":"oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
         "createdBy":"oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
         "transferredBy":"oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
         "creationDate":"2022-04-05T08:30:42.000Z",
         "transferredDate":"2022-04-05T09:28:30.000Z",
         "isBurned":false,
         "tokenUri":"https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg",
         "price":100,
         "on_sale_flag":true
      }
   }
]
getAllTokens
此方法會傳回儲存在狀態資料庫中的所有記號資產。此方法使用 Berkeley 資料庫 SQL 豐富查詢,且只能在連線至遠端 Oracle Blockchain Platform 網路時呼叫。這是非同步靜態函數。
Ctx.ERC721Token.getAllTokens()
參數:
傳回值:
  • 成功時,對所有權杖資產都有承諾。發生錯誤時,拒絕並顯示錯誤訊息。
範例:

await this.Ctx.ERC721Token.getAllTokens();

{
   "returnCode":"Success",
   "error":"",
   "result":{
      "txid":"98e0a0a115803d25b843d630e6b23c435a192a03eb0a301fc9375f05da49a8b2",
      "payload":[
         "           "{
            "metadata":{
               "painting_name":"Mona_Lisa",
               "description":"Mona Lisa Painting",
               "image":"monalisa.jpeg",
               "painter_name":"Leonardo_da_Vinci"
            },
            "assetType":"otoken",
            "tokenId":"monalisa",
            "tokenName":"artcollection",
            "tokenDesc":"token description",
            "symbol":"ART",
            "tokenStandard":"erc721+",
            "tokenType":"nonfungible",
            "tokenUnit":"whole",
            "behaviors":[
               "indivisible",
               "singleton",
               "mintable",
               "transferable",
               "burnable",
               "roles"
            ],
            "roles":{
               "minter_role_name":"minter"
            },
            "mintable":{
               "max_mint_quantity":20000
            },
            "owner":"oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
            "createdBy":"oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
            "creationDate":"2022-04-05T08:30:42.000Z",
            "isBurned":false,
            "tokenUri":"\"https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg\"",
            "price":100,
            "on_sale_flag":false
         }"       "
      ],
      "encode":"JSON"
   }
}
getAllTokensByUser
此方法會傳回指定帳戶 ID 所擁有的所有記號。這是非同步靜態函數。
Ctx.ERC721Token.getAllTokensByUser(accountId: string)
參數:
  • accountId: string - 帳戶的 ID。
傳回值:
  • 成功時,指定科目的承諾歷史記錄查詢重複程式。發生錯誤時,拒絕並顯示錯誤訊息。
傳回值範例:
{
   "returnCode":"Success",
   "error":"",
   "result":{
      "txid":"98e0a0a115803d25b843d630e6b23c435a192a03eb0a301fc9375f05da49a8b2",
      "payload":[
         "           "{
            "metadata":{
               "painting_name":"Mona_Lisa",
               "description":"Mona Lisa Painting",
               "image":"monalisa.jpeg",
               "painter_name":"Leonardo_da_Vinci"
            },
            "assetType":"otoken",
            "tokenId":"monalisa",
            "tokenName":"artcollection",
            "tokenDesc":"token description",
            "symbol":"ART",
            "tokenStandard":"erc721+",
            "tokenType":"nonfungible",
            "tokenUnit":"whole",
            "behaviors":[
               "indivisible",
               "singleton",
               "mintable",
               "transferable",
               "burnable",
               "roles"
            ],
            "roles":{
               "minter_role_name":"minter"
            },
            "mintable":{
               "max_mint_quantity":20000
            },
            "owner":"oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
            "createdBy":"oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
            "creationDate":"2022-04-05T08:30:42.000Z",
            "isBurned":false,
            "tokenUri":"\"https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg\"",
            "price":100,
            "on_sale_flag":false
         }"       "
      ],
      "encode":"JSON"
   }
ownerOf
此方法會傳回指定記號之擁有者的帳戶 ID。這是非同步靜態函數。
Ctx.ERC721Token.ownerOf(tokenId: string)
參數:
  • tokenId: string - 記號的 ID。
傳回值:
  • 成功時,它會傳回指定記號 ID 的承諾歷史記錄查詢重複程式。發生錯誤時會拒絕並顯示錯誤訊息
傳回值範例:
{"owner": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d"}
tokenUri
此方法會傳回指定記號的 URI。這是非同步靜態函數。
Ctx.ERC721Token.tokenUri(tokenId: string)
參數:
  • tokenId: string - 記號的 ID。
傳回值:
  • 成功時,它會傳回指定記號 ID 的承諾歷史記錄查詢重複程式。發生錯誤時會拒絕並顯示錯誤訊息
傳回值範例:
{"uri": "https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg"}
getTokenUri
此方法會傳回指定記號的 URI。這是非同步靜態函數。
Ctx.ERC721Token.getTokenUri(tokenId: string)
參數:
  • tokenId: string - 記號的 ID。
傳回值:
  • 成功時,它會傳回指定記號 ID 的承諾歷史記錄查詢重複程式。發生錯誤時會拒絕並顯示錯誤訊息
傳回值範例:
{"tokenUri": https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg"}
symbol
這個方法會傳回記號類別的符號。
Ctx.ERC721Token.symbol()
參數:
傳回值:
  • 成功時,含有權杖符號的 JSON 物件。
傳回值範例:
{"symbol": "PNT"}

帳戶管理方法

generateAccountId
此方法會傳回帳戶 ID,透過串連成員服務提供者 ID (orgId) 和使用者名稱或電子郵件 ID (userId) 來形成,然後建立 SHA-256 雜湊。
Ctx.ERC721Account.generateAccountId(orgId: string, userId: string)
參數:
  • orgId: string - 目前組織中使用者的成員服務提供者 (MSP) ID。
  • userId: string - 使用者的使用者名稱或電子郵件 ID。
傳回值:
  • 成功時,所產生帳戶 ID 的承諾。發生錯誤時,拒絕並顯示錯誤訊息。
範例:

await this.Ctx.ERC721Account.generateAccountId(orgId, userId)

oaccount~a0a60d54ba9e2ff349737d292ea10ebd9cc8f1991c11443c19d20aea299a9507
createAccount
此方法會為指定的使用者和記號建立一個帳戶。必須為任何時候會有權杖的任何使用者建立帳戶。帳戶會追蹤使用者擁有的 NFT 數目。使用者必須在網路中擁有帳戶,才能完成權杖相關作業。每位使用者只能建立一個 NFT 帳戶。

帳戶 ID 是一組文數字字元,前面加上 oaccount~,後面加上目前網路組織中使用者之成員服務提供者 ID (orgId) 的 SHA-256 雜湊、執行處理擁有者的使用者名稱或電子郵件 ID (userId)、登入執行處理的使用者,以及常數字串 nft。鏈碼的 Token Admin 只能呼叫此方法。

Ctx.ERC721Account.createAccount(orgId: string, userId: string, tokenType: string)
參數:
  • orgId: string - 目前組織中使用者的成員服務提供者 (MSP) ID。
  • userId: string - 使用者的使用者名稱或電子郵件 ID。
  • tokenType: string - 唯一支援的權杖類型是 nonfungible
傳回值:
  • 成功時,新帳戶物件的承諾。發生錯誤時,拒絕並顯示錯誤訊息
範例:

await this.Ctx.ERC721Account.CreateAccount(orgId, userId, tokenType)

{
    "assetType": "oaccount",
    "accountId": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
    "userId": "admin",
    "orgId": "Org1MSP",
    "tokenType": "nonfungible",
    "noOfNfts": 0
}
getAllAccounts
此方法會傳回所有帳戶的清單。此方法使用 Berkeley 資料庫 SQL 豐富查詢,且只能在連線至遠端 Oracle Blockchain Platform 網路時呼叫。
Ctx.ERC721Account.getAllAccounts()
參數:
傳回值:
  • 成功時,使用列出所有帳戶的 JSON 物件的承諾。發生錯誤時,拒絕並顯示錯誤訊息。
傳回值範例:
[
    {
        "key": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
        "valueJson": {
            "assetType": "oaccount",
            "accountId": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
            "userId": "admin",
            "orgId": "Org1MSP",
            "tokenType": "nonfungible",
            "noOfNfts": 1
        }   
    }
]
history
此方法會傳回指定帳戶的帳戶歷史記錄詳細資料陣列。
Ctx.ERC721Account.history(accountId: string)
參數:
  • accountId: string - 帳戶的 ID。
傳回值:
  • 成功時,包含指定帳戶之帳戶歷史記錄詳細資訊的 map[string]interface{} 陣列。帳戶資料會顯示在地圖的 value 索引鍵下方。發生錯誤時,包含錯誤訊息的非零錯誤物件。
範例:

await this.Ctx.ERC721Account.history(accountId)

[
    {
        "trxId": "6ffd0d94f234c12444a5d5aa559563b59dff4d2280b573fea956dc632bdaf5d4",
        "timeStamp": 1649151044,
        "value": {
            "assetType": "oaccount",
            "accountId": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
            "userId": "admin",
            "orgId": "Org1MSP",
            "tokenType": "nonfungible",
            "noOfNfts": 1
        }
    },
    {
        "trxId": "a605f1fa62e511c2945fce5437f983a5e70ec814b82520d3ecd2d81e3ecf53a3",
        "timeStamp": 1649151022,
        "value": {
            "assetType": "oaccount",
            "accountId": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
            "userId": "admin",
            "orgId": "Org1MSP",
            "tokenType": "nonfungible",
            "noOfNfts": 2
        }
    },
    {
        "trxId": "ca4c07bf04240345de918cbf1f4f3da4b4d0ab044c5b8bea94343e427d9ed4e7",
        "timeStamp": 1649150910,
        "value": {
            "assetType": "oaccount",
            "accountId": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
            "userId": "admin",
            "orgId": "Org1MSP",
            "tokenType": "nonfungible",
            "noOfNfts": 1
        }
    },
    {
        "trxId": "cfb52ffc8c34c7fd86210fcf8c5f53d9f92a056c45ed3a33671d638020c1f9cb",
        "timeStamp": 1649149545,
        "value": {
            "assetType": "oaccount",
            "accountId": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
            "userId": "admin",
            "orgId": "Org1MSP",
            "tokenType": "nonfungible",
            "noOfNfts": 0
        }
    },
    {
        "trxId": "e7747b3001a170f88688620956320e9402e1dd8edad8afb4818a08a34647337c",
        "timeStamp": 1649147442,
        "value": {
            "assetType": "oaccount",
            "accountId": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
            "userId": "admin",
            "orgId": "Org1MSP",
            "tokenType": "nonfungible",
            "noOfNfts": 1
        }
    },
    {
        "trxId": "d2d1f9c898707ae831e9361bc25da6369eac37b10c87dc04d18d6f3808222f08",
        "timeStamp": 1649137534,
        "value": {
            "assetType": "oaccount",
            "accountId": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
            "userId": "admin",
            "orgId": "Org1MSP",
            "tokenType": "nonfungible",
            "noOfNfts": 0
        }
    }
]
getUserByAccountId
此方法會傳回指定帳戶的使用者詳細資訊。
Ctx.ERC721Account.getUserByAccountId(accountId: string)
參數:
  • accountId: string - 帳戶的 ID。
傳回值:
  • 成功時,包含下列特性中使用者詳細資訊的 JSON 物件:
    • orgId - 目前網路組織中使用者的成員服務提供者 (MSP) ID。
    • userId - 使用者的使用者名稱或電子郵件 ID。
  • 發生錯誤時,拒絕並顯示錯誤訊息。
範例:

await this.Ctx.ERC721Account.getUserByAccountById(accountId)

{
  "userId": "admin",
  "orgId": "Org1MSP"
}
getAccountWithStatusByUser
此方法會傳回指定帳戶的使用者詳細資訊,包括帳戶狀態。此方法只能由鏈碼的 Token Admin 或帳戶的 Account Owner 呼叫。
Ctx.ERC721Account.getAccountWithStatusByUser(orgId, userId)
參數:
  • orgId - 目前組織中使用者的成員服務提供者 (MSP) ID。
  • userId - 使用者的使用者名稱或電子郵件 ID。
傳回值:
  • 成功時,包含下列特性的 JSON 帳戶物件:
  • accountId - 使用者帳戶的 ID。
  • userId - 使用者的使用者名稱或電子郵件 ID。
  • orgId - 目前組織中使用者的成員服務提供者 (MSP) ID。
  • tokenType - 帳戶保留的權杖類型。
  • noOfNfts - 帳戶持有的 NFT 總數。
  • bapAccountVersion - 內部使用的帳戶物件參數。
  • status - 使用者帳戶的目前狀態。
  • 發生錯誤時,包含錯誤訊息的非空值物件。
範例:

await this.Ctx.ERC721Account.getAccountWithStatusByUser(orgId, userId)

{
  "bapAccountVersion": 0,
  "assetType": "oaccount",
  "status": "active",
  "accountId": "oaccount~cc301bee057f14236a97d434909ec1084970921b008f6baab09c2a0f5f419a9a",
  "userId": "idcqa",
  "orgId": "appdev",
  "tokenType": "nonfungible",
  "noOfNfts": 0
}
getAccountByUser
此方法會傳回指定帳戶的使用者詳細資訊。此方法只能由鏈碼的 Token Admin 或帳戶的 Account Owner 呼叫。
Ctx.ERC721Account.getAccountByUser(orgId, userId)
參數:
  • orgId - 目前組織中使用者的成員服務提供者 (MSP) ID。
  • userId - 使用者的使用者名稱或電子郵件 ID。
傳回值:
  • 成功時,包含下列特性的 JSON 帳戶物件:
  • accountId - 使用者帳戶的 ID。
  • userId - 使用者的使用者名稱或電子郵件 ID。
  • orgId - 目前組織中使用者的成員服務提供者 (MSP) ID。
  • tokenType - 帳戶保留的權杖類型。
  • noOfNfts - 帳戶持有的 NFT 總數。
  • 發生錯誤時,包含錯誤訊息的非空值物件。
範例:

await this.Ctx.ERC721Account.getUserByAccountById(orgId, userId)

{
    "assetType": "oaccount",
    "accountId": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
    "userId": "admin",
    "orgId": "Org1MSP",
    "tokenType": "nonfungible",
    "noOfNfts": 0
}
balanceOf
此方法會傳回指定使用者保留的 NFT 總數。
Ctx.ERC721Account.balanceOf(accountId: string)
參數:
  • accountId: string - 使用者的帳戶 ID。
傳回值:
  • 成功時,目前 NFT 計數的 JSON 物件。發生錯誤時,包含錯誤訊息的非零錯誤物件。
範例:

await this.Ctx.ERC721Account.balanceOf(accountId)

{"totalNfts": 0}

角色管理方法

addRoleMember
這個方法會將角色新增至指定的使用者和記號。帳戶 ID 是透過建立串連成員服務提供者 ID (orgId) 的 SHA-256 雜湊和使用者名稱或電子郵件 ID (userId) 來形成。這是非同步函數。
Ctx.ERC721Token.addRoleMember(role: string, accountId: string)
參數:
  • role: string - 要新增至指定使用者的角色名稱。mintableburnable 行為對應至規格檔案的 minter_role_nameburner_role_name 特性。
  • accountId: string - 要操作的帳戶 ID。
傳回值:
  • 成功時,包含新增角色與帳戶 ID 等訊息的承諾。發生錯誤時,拒絕並顯示錯誤訊息
範例:

await this.Ctx.ERC721Token.addRoleMember(role, accountId);

{"msg": "Successfully added role 'minter' to Account Id: oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d (Org-Id: Org1MSP, User-Id: admin)"}
removeRoleMember
此方法會從指定的使用者和記號移除角色。帳戶 ID 是透過建立串連成員服務提供者 ID (orgId) 的 SHA-256 雜湊和使用者名稱或電子郵件 ID (userId) 來形成。這是非同步函數。
Ctx.ERC721Token.removeRoleMember(role: string, accountId: string)
參數:
  • role: string - 要從指定使用者移除的角色名稱。mintableburnable 行為對應至規格檔案的 minter_role_nameburner_role_name 特性。
  • accountId: string - 要操作的帳戶 ID。
傳回值:
  • 成功時,包含已移除角色與帳戶 ID 等訊息的承諾。發生錯誤時,拒絕並顯示錯誤訊息
範例:

await this.Ctx.ERC721Token.removeRoleMember(role, accountId);

{"msg": "Successfully removed role 'minter' from Account Id: oaccount~ec32cff8635a056f3dda3da70b1d6090d61f66c6a170c4a95fd008181f729dba (Org-Id: Org1MSP, User-Id: user1)"}
isInRole
此方法會傳回布林值,指示使用者和記號是否具有指定的角色。帳戶 ID 是透過建立串連成員服務提供者 ID (orgId) 的 SHA-256 雜湊和使用者名稱或電子郵件 ID (userId) 來形成。這是非同步函數。
Ctx.ERC721Token.isInRole(role: string, accountId: string)
參數:
  • role: string - 檢查指定使用者的角色名稱。mintableburnable 行為對應至規格檔案的 minter_role_nameburner_role_name 特性。
  • accountId: string - 要操作的帳戶 ID。
傳回值:
  • 成功時,如果指定帳戶 ID 有角色,則承諾為真,否則為假。發生錯誤時,拒絕並顯示錯誤訊息
範例:

await this.Ctx.ERC721Token.isInRole(role, accountId, tokenAsset)

{"result": "true"}
getAccountsByRole
此方法會傳回指定角色的所有帳戶 ID 清單。
Ctx.ERC721Role.getAccountsByRole(roleName: string)
參數:
  • roleName: string - 要搜尋的角色名稱。
傳回值:
  • 成功時,帳戶 ID 的 JSON 陣列。發生錯誤時,包含錯誤訊息的非零錯誤物件。
範例:

await this.Ctx.ERC721Role.getAccountsByRole(userRole)

{
    "accounts": [
        "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d"
    ]
}
getUsersByRole
此方法會傳回指定角色的所有使用者清單。
Ctx.ERC721Role.getUsersByRole(userRole: string)
參數:
  • role: string - 要搜尋的角色名稱。
傳回值:
  • 成功時,使用者物件的 JSON 陣列。每個物件都包含使用者 ID 與組織 ID。發生錯誤時,包含錯誤訊息的非零錯誤物件。
範例:

await this.Ctx.ERC721Role.getUsersByRole(userRole)

{
    "users": [
        {
            "userId": "admin",
            "orgId": "Org1MSP"
        }
    ]
}

交易歷史記錄管理的方法

getAccountTransactionHistory
此方式會傳回指定科目的交易歷史記錄明細陣列。
Ctx.ERC721Account.getAccountTransactionHistory(accountId: string)
參數:
  • accountId: string - 帳戶的 ID。
傳回值:
  • 成功時,JSON 格式的一系列帳戶交易物件:
    • transactionId - 交易的 ID。
    • transactedAccount - 進行交易的帳戶。
    • transactionType - 交易的類型。
    • timestamp - 異動的時間。
    • noOfNfts - 來電者帳戶的餘額。
    • 發生錯誤時,包含錯誤訊息的非零錯誤物件。
範例:

await this.Ctx.ERC721Account.GetAccountTransactionHistory(accountId)

[
    {
        "transactionId": "otransaction~6ffd0d94f234c12444a5d5aa559563b59dff4d2280b573fea956dc632bdaf5d4",
        "timestamp": "2022-04-05T09:30:44.000Z",
        "tokenId": "monalisa1",
        "transactedAccount": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
        "transactionType": "BURN"
    },
    {
        "transactionId": "otransaction~a605f1fa62e511c2945fce5437f983a5e70ec814b82520d3ecd2d81e3ecf53a3",
        "timestamp": "2022-04-05T09:30:22.000Z",
        "tokenId": "monalisa1",
        "transactedAccount": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
        "transactionType": "MINT"
    },
    {
        "transactionId": "otransaction~ca4c07bf04240345de918cbf1f4f3da4b4d0ab044c5b8bea94343e427d9ed4e7",
        "timestamp": "2022-04-05T09:28:30.000Z",
        "tokenId": "monalisa",
        "transactedAccount": "oaccount~ec32cff8635a056f3dda3da70b1d6090d61f66c6a170c4a95fd008181f729dba",
        "transactionType": "CREDIT"
    },
    {
        "transactionId": "otransaction~cfb52ffc8c34c7fd86210fcf8c5f53d9f92a056c45ed3a33671d638020c1f9cb",
        "timestamp": "2022-04-05T09:05:45.000Z",
        "tokenId": "monalisa",
        "transactedAccount": "oaccount~ec32cff8635a056f3dda3da70b1d6090d61f66c6a170c4a95fd008181f729dba",
        "transactionType": "DEBIT"
    },
    {
        "transactionId": "otransaction~e7747b3001a170f88688620956320e9402e1dd8edad8afb4818a08a34647337c",
        "timestamp": "2022-04-05T08:30:42.000Z",
        "tokenId": "monalisa",
        "transactedAccount": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
        "transactionType": "MINT"
    }
]
getAccountTransactionHistoryWithFilters
此方法會傳回指定使用者的帳戶交易歷史記錄,依 PageSizeBookmarkstartTimeendTime 篩選。連線至遠端 Oracle Blockchain Platform 網路時才能呼叫此方法。
async getAccountTransactionHistoryWithFilters(orgId: string, userId: string, filters?: Filters)
參數:
  • accountId: string - 帳戶的 ID。
  • filters: object - 包含四個屬性的 Filter 類別物件:pageSizebookmarkstartTimeendTime。如果空白,則會傳回所有記錄。PageSize 特性決定要傳回的記錄數目。如果 PageSize 為 0,則預設頁面大小為 20。Bookmark 特性決定要傳回之記錄的開始索引。如需詳細資訊,請參閱 Hyperledger Fabric 文件。必須以 RFC-3339 格式指定 StartTimeEndTime 特性。
傳回值:
  • 成功時,JSON 格式的一系列帳戶交易物件:
    • transactionId - 交易的 ID。
    • transactedAccount - 進行交易的帳戶。
    • transactionType - 交易的類型。
    • timestamp - 異動的時間。
    • noOfNfts - 來電者帳戶的餘額。
    • 發生錯誤時,包含錯誤訊息的非零錯誤物件。
範例:

await this.Ctx.ERC721Account.getAccountTransactionHistoryWithFilters(accountId, filters)

[
    {
        "transactionId": "otransaction~ca4c07bf04240345de918cbf1f4f3da4b4d0ab044c5b8bea94343e427d9ed4e7",
        "timestamp": "2022-04-05T09:28:30.000Z",
        "tokenId": "monalisa",
        "transactedAccount": "oaccount~ec32cff8635a056f3dda3da70b1d6090d61f66c6a170c4a95fd008181f729dba",
        "transactionType": "CREDIT"
    },
    {
        "transactionId": "otransaction~cfb52ffc8c34c7fd86210fcf8c5f53d9f92a056c45ed3a33671d638020c1f9cb",
        "timestamp": "2022-04-05T09:05:45.000Z",
        "tokenId": "monalisa",
        "transactedAccount": "oaccount~ec32cff8635a056f3dda3da70b1d6090d61f66c6a170c4a95fd008181f729dba",
        "transactionType": "DEBIT"
    },
    {
        "transactionId": "otransaction~e7747b3001a170f88688620956320e9402e1dd8edad8afb4818a08a34647337c",
        "timestamp": "2022-04-05T08:30:42.000Z",
        "tokenId": "monalisa",
        "transactedAccount": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
        "transactionType": "MINT"
    }
]
getTransactionById
此方法會傳回 Transaction 資產的歷史記錄。
Ctx.ERC721Transaction.getTransactionById(transactionId: string)
參數:
  • transactionId: string - 交易資產的 ID。
範例:

await this.Ctx.ERC721Transaction.getTransactionById(transactionId)

{
    "transactionId": "otransaction~6ffd0d94f234c12444a5d5aa559563b59dff4d2280b573fea956dc632bdaf5d4",
    "history": [
        {
            "trxId": "6ffd0d94f234c12444a5d5aa559563b59dff4d2280b573fea956dc632bdaf5d4",
            "timeStamp": 1649151044,
            "value": {
                "assetType": "otransaction",
                "transactionId": "otransaction~6ffd0d94f234c12444a5d5aa559563b59dff4d2280b573fea956dc632bdaf5d4",
                "tokenId": "monalisa1",
                "fromAccountId": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
                "toAccountId": "",
                "triggeredByAccountId": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
                "transactionType": "BURN",
                "timestamp": "2022-04-05T09:30:44.000Z",
            }
        }
    ]
}
deleteHistoricalTransactions
此方法會從狀態資料庫中刪除早於指定日期的交易。
Ctx.ERC721Transaction.deleteTransactions(timeToExpiration: Date)
參數:
  • timeToExpiration: Date - 日期和時間。將會刪除超過指定時間的交易。
範例:

await this.Ctx.ERC721Transaction.deleteTransactions(timeToExpiration)

{
    "returnCode": "Success",
    "error": "",
    "result": {
        "txid": "62ad6753cf2bfa54816b4c2f0ea325478b1cb1b84f8e13e6742c00f277310081",
        "payload": {
            "msg": "Successfuly deleted transaction older than date: Fri Apr 08 2022 00:00:00 GMT+0000 (Coordinated Universal Time).",
            "transactions": [
                "otransaction~e687531b71d943da2fb129638784fb93a96e7698013dfc51c8c6bf4f5f797059",
                "otransaction~18446adf59b669e12990a1cf3ea0a7a15764f967fa694cf263aee0cd5a21d952",
                "otransaction~5560d4b5e0b0d0b9a6e97dcd7f81241a5daf56497a7b6819c6a55cebacc106f2",
                "otransaction~f0a0a64ec1a0c92ac732706dd75ffbd3feecd9c48fc79e42c551485edf0542cb"
            ]
        },
        "encode": "JSON"
    }
}

權杖行為管理 - 可調整行為

getMaxMintQuantity
此方法會傳回記號的最大可修改數量。如果規格檔案中未設定 max_mint_quantity 行為,則預設值為 0,且可提示無限數目的記號。
Ctx.ERC721Token.getMaxMintQuantity(token: <Instance of Token Class>)
參數:
  • token: <Instance of Token Class> - 要操作的記號資產。
傳回值:
  • 成功時,數字資料類型中變數替代字的最大可修改數量。發生錯誤時,會傳回錯誤訊息。
範例:

await this.Ctx.ERC721Token.getMaxMintQuantity(tokenAsset);

20000
getTotalMintedTokens
此方法會針對指定的記號,傳回系統中可用的記號總數。可用記號的淨數量是經過改寫的記號總數減去已燒錄的記號數目。這是非同步函數。
Ctx.ERC721Token.getTotalMintedTokens()
參數:
  • token: <Instance of Token Class> - 要操作的記號資產。
傳回值:
  • 成功時,數字資料類型中提示的記號總計。發生錯誤時,會傳回錯誤訊息。
範例:

await this.Ctx.ERC721Token.getTotalMintedTokens(tokenAsset);

4000

權杖行為管理 - 可轉移的行為

safeTransferFrom
這是非同步函數。此方法會將指定 NFT 的所有權從呼叫程式轉移到另一個帳戶。此方法包含下列驗證:
  • 記號存在且未被燒錄。
  • 寄件者帳戶與接收者帳戶存在且不是相同帳戶。
  • 寄件者帳戶擁有權杖。
  • 函數的呼叫者是寄件者。
Ctx.ERC721Token.safeTransferFrom(fromAccountId: string, toAccountId: string, token: <Instance of Token Class>, data?: string)
參數:
  • fromAccountId: string - 目前組織中寄件者的帳戶 ID。
  • toAccountId: string - 目前組織中接收者的帳戶 ID。
  • token: <Instance of Token Class> - 要傳輸的權杖資產。
  • data: string - 儲存在交易中的選擇性其他資訊。
傳回值:
  • 成功時,含有包含帳戶明細之成功訊息的承諾。帳戶 ID 的字首為 oaccount~。發生錯誤時,拒絕並顯示錯誤訊息。
範例:

await this.Ctx.ERC721Token.safeTransferFrom(fromAccountId, toAccountId, tokenAsset, data);

{"msg": "Successfully transferred NFT token: 'monalisa' from Account-Id: oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d (Org-Id: Org1MSP, User-Id: admin) to Account-Id: oaccount~ec32cff8635a056f3dda3da70b1d6090d61f66c6a170c4a95fd008181f729dba (Org-Id: Org1MSP, User-Id: user1)"}
transferFrom
這是非同步函數。此方法會將指定 NFT 的所有權從寄件者帳戶轉移至接收者帳戶。呼叫者必須負責傳送正確的參數。任何使用者都可以呼叫此方法,而不只是記號擁有者。此方法包含下列驗證:
  • 記號存在且未被燒錄。
  • 寄件者帳戶與接收者帳戶存在且不是相同帳戶。
  • 寄件者帳戶擁有權杖。
Ctx.ERC721Token.transferFrom(fromAccountId: string, toAccountId: string, token: <Instance of Token Class>)
參數:
  • fromAccountId: string - 目前組織中寄件者的帳戶 ID。
  • toAccountId: string - 目前組織中接收者的帳戶 ID。
  • token: <Instance of Token Class> - 要傳輸的權杖資產。
傳回值:
  • 成功時,含有包含帳戶明細之成功訊息的承諾。帳戶 ID 的字首為 oaccount~。發生錯誤時,拒絕並顯示錯誤訊息。
\ 範例:

await this.Ctx.ERC721Token.transferFrom(fromAccountId, toAccountId, tokeAsset, data);

{"msg": "Successfully transferred NFT token: 'monalisa' from Account-Id: oaccount~ec32cff8635a056f3dda3da70b1d6090d61f66c6a170c4a95fd008181f729dba (Org-Id: Org1MSP, User-Id: user1) to Account-Id: oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d (Org-Id: Org1MSP, User-Id: admin)"}

權杖行為管理 - 可燒錄行為

burn
此方法會從來電者的帳戶停用或燒錄指定的 NFT。這個方法的呼叫程式必須要有一個帳戶。除非記號規格檔案包含 burnable 行為,否則無法燒錄記號。如果規格檔案的 roles 區段中未指定 burner_role_name 特性,則記號的擁有者可燒錄記號。如果在 roles 區段中指定了 burner_role_name 特性,則被指派燒錄者角色的使用者同時也是記號的 minter (建立者) 可以燒錄記號。這是非同步函數。
Ctx.ERC721Token.burn(token: <Instance of Token Class>)
參數:
  • token: <Instance of Token Class> - 要燒錄的記號資產。
傳回值:
  • 成功時,含有包含帳戶明細之成功訊息的承諾。發生錯誤時,拒絕並顯示錯誤訊息。
範例:

await this.Ctx.ERC721Token.burn(tokenAsset);

{msg": "Successfully burned NFT token: 'monalisa1' from Account-Id: oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d (Org-Id: Org1MSP, User-Id: admin)"}