PERSONAの生成・配布
概要図
PERSONAの生成
吸収(Absorb)
こちら を参照
PERSONA コントラクト
■パブリッシャー向けfunction
PERSONAの生成(Persona.sol)
@param to PERSONAの生成先アドレス
@param fromId mintする PersonaのID部の開始値。生成するPersonaのIDは以下の構造を持つ256bitデータ
生成するpersona token の token ID は persona id in contents 部が fromId からfromId + numTokens - 1までの値を持つ
全てのIDは未使用である必要がある。
255 32 31 16 15 0
+--------------------------+-------------+-------------+
| persona id in contents | square key | contents id |
+--------------------------+-------------+-------------+
@param numTokens mintするPersona token の数
@param conditions MintCondition
@return 生成したPersona token のIDの配列
function mintBatch(address to,uint256 fromId,uint256 numTokens,MintCondition[] calldata conditions) public onlyMinter returns (uint256[] memory tokens)
PERSONAの生成(配列なしversion)(Persona.sol)
function mintBatchUnified(address to,uint256 fromId,uint256 numTokens,MintCondition calldata condition) public returns (uint256[] memory tokens)
fromIdの求め方
mintに使用するfromIdはfindAvailableIdsで求めることができる。下部に記載の「使用可能なPERSONA IDを検索するfunction」を参照。
MintCondition
@param animaAmounts 各Personaのmintに投入するAnima token の量。要素数はnumTokensであること。
この配列の合計数のanimaを、本function呼び出し前に Personaコントラクトに対してapproveしていなければならない。
square keyが紐づくKnightのseat毎に設定されているanimaの最低・最高投入量の範囲内でなければならない。
@param weightsList 生成する各Personaの能力値の割当Weight。要素数はnumTokensであること。各要素は以下の構造を持つ
weights[n][0] n番目に生成するpersonaのABSの重み
weights[n][1] n番目に生成するpersonaのDFTの重み
weights[n][2] n番目に生成するpersonaのMNDの重み
weights[n][3] n番目に生成するpersonaのINTの重み
weights[n][4] n番目に生成するpersonaのEXPの重み
struct MintCondition {
uint256 animaAmounts; // 投入animaの量
uint64 elements; // エレメントを指定(0~6)
uint8[5] weights; // 生成する各Personaの能力値の割当Weight
string metadata; // 設定するmetadata
}
PERSONAの持つ属性値について:
パラメーターとして以下の6つの属性値を持つ。
属性値はAbsorbにより増減が発生する。
また、Drawchain実行の条件として使用することができる。
FOR (Force/エネルギー)
ABS (Abyss/深淵)
DFT (Determination/意思)
MND (Mind/精神)
INT (Intelligence/知識)
EXP (Experience/経験値)
属性値の割り当てについて:
Personaをmintする際に投入するanimaの量により属性値の合計が決まる。
投入量が多いと生成されるPersonaの属性値の合計が高くなる。
投入量は自身が所属するKnightの席番に設定されている範囲内で設定が可能。
この属性値の合計を元に、mintする際に設定する割当Weightにより各属性値が決定する。
FORは固定割当(合計値の1/6)のため、残りの属性値に割当を設定する。
なお、各属性の最大値は4195。
例)
投入anima量:10
割当Weight[ABS,DFT,MND,INT,EXP][2,1,1,1,1]
⇒合計値:549
生成されるPresonaの属性値[FOR,ABS,DFT,MND,INT,EXP][91,152,76,76,76,76]
投入anima量と属性値の合計の関係は以下の図を参照
投入anima |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
52 |
54 |
56 |
58 |
60 |
62 |
64 |
66 |
68 |
70 |
72 |
74 |
76 |
78 |
80 |
82 |
84 |
86 |
88 |
90 |
92 |
94 |
96 |
98 |
100 |
105 |
110 |
115 |
120 |
125 |
130 |
135 |
140 |
145 |
150 |
155 |
160 |
165 |
170 |
175 |
180 |
185 |
190 |
195 |
200 |
210 |
220 |
230 |
240 |
250 |
260 |
270 |
280 |
290 |
300 |
310 |
320 |
330 |
340 |
350 |
360 |
370 |
380 |
390 |
400 |
420 |
440 |
460 |
480 |
500 |
520 |
540 |
560 |
580 |
600 |
620 |
640 |
660 |
680 |
700 |
720 |
740 |
760 |
780 |
800 |
820 |
840 |
860 |
880 |
900 |
920 |
940 |
960 |
980 |
10000 |
10200 |
10400 |
10600 |
10800 |
11000 |
11200 |
11400 |
11600 |
11800 |
12000 |
12200 |
12400 |
12600 |
12800 |
13000 |
13200 |
13400 |
13600 |
13800 |
14000 |
14200 |
14400 |
14600 |
14800 |
15000 |
15200 |
15400 |
15600 |
15800 |
16000 |
16400 |
16800 |
17200 |
17600 |
18000 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
総合属性値 |
355 |
452 |
549 |
645 |
742 |
839 |
935 |
1032 |
1129 |
1226 |
1322 |
1419 |
1516 |
1612 |
1709 |
1806 |
1902 |
2000 |
2040 |
2080 |
2120 |
2160 |
2200 |
2240 |
2280 |
2320 |
2360 |
2400 |
2440 |
2480 |
2520 |
2560 |
2600 |
2640 |
2680 |
2720 |
2760 |
2800 |
2840 |
2880 |
2920 |
2960 |
3000 |
3040 |
3080 |
3120 |
3160 |
3200 |
3240 |
3280 |
3320 |
3360 |
3400 |
3440 |
3480 |
3520 |
3560 |
3600 |
3640 |
3680 |
3720 |
3760 |
3800 |
3840 |
3880 |
3920 |
3960 |
4000 |
4050 |
4100 |
4150 |
4200 |
4250 |
4300 |
4350 |
4400 |
4450 |
4500 |
4550 |
4600 |
4650 |
4700 |
4750 |
4800 |
4850 |
4900 |
4950 |
5000 |
5050 |
5100 |
5150 |
5200 |
5250 |
5300 |
5350 |
5400 |
5450 |
5500 |
5550 |
5600 |
5650 |
5700 |
5750 |
5800 |
5850 |
5900 |
5950 |
6000 |
6058 |
6117 |
6175 |
6234 |
6292 |
6351 |
6409 |
6468 |
6526 |
6585 |
6626 |
6668 |
6709 |
6751 |
6792 |
6834 |
6875 |
6917 |
6958 |
7000 |
7032 |
7064 |
7096 |
7128 |
7161 |
7193 |
7225 |
7257 |
7289 |
7322 |
7348 |
7374 |
7400 |
7427 |
7453 |
7479 |
7506 |
7532 |
7558 |
7585 |
7607 |
7629 |
7651 |
7673 |
7696 |
7718 |
7740 |
7762 |
7784 |
7807 |
7826 |
7845 |
7864 |
7884 |
7903 |
7922 |
7942 |
7961 |
7980 |
8000 |
8000 |
8000 |
8000 |
8000 |
8000 |
metadataについて:
以下の手順で設定する。
・設定したい画像をIPFSにアップロードし、hashを取得。
・jsonファイルをIPFSにアップロードし、hashを取得。
・上記で取得したhashをmetadataに設定する。
jsonファイルのフォーマットは以下となる。
{
"name": "persona", // PRSONAの名前
"creator": "user", // 作成者の名前
"image": "QmYCQ3oX4M8snuesMah8cCfH5z9wuDWZm9rxLmZT5z1BzH", // 画像をアップロードしたhash
"description": "" // 説明
}
メタデータ(変更可能)を設定する(Persona.sol)
@param tokenId PersonaTokenID
@param metadata 設定するmetadata
function setMutableMetadata(uint256 tokenId,string memory metadata)
メタデータを取得する(Persona.sol)
@param tokenId PersonaTokenID
@return immutableMetadata,mutableMetadata
function getMetadata(uint256 tokenId) public view returns(string memory immutableMetadata,string memory mutableMetadata)
使用可能なPERSONA IDを検索する(Persona.sol)
@param _fromId 開始tokenId
@param _untilId 終了tokenId
@param numTokens 個数
@return uint256 0 : 検索範囲内に条件を満たすIDは存在しない。それ以外:利用可能な先頭のID。
function findAvailableIds(uint256 _fromId,uint256 _untilId,uint256 numTokens) external view returns (uint256)
使用方法sample
// 検索開始値
const fromId = squareKey.shln(16);
// 検索終了値
const untilId = fromId.or(new BN('ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000',16));
// 使用可能なPERSONA IDを検索
const targetId = await persona.findAvailableIds(fromId,untilId,検索したい個数);
// 検索したIDをmintBatchに使用
await persona.mintBatch(mint先のaddress, targetId, mintするPersona tokenの数, [conditions]);
所有者以外のアドレスに特定のNFTの転送を承認する(署名あり)(Persona.sol)
@param to 転送先のaddress
@param tokenId PERSONA ID
@param nonce 署名生成手順参照
@param sig 署名生成手順参照
function approve(address to,uint256 tokenId,uint256 nonce,bytes memory sig) public validToken(tokenId)
NFTの転送(署名あり)(Persona.sol)
@param from 転送元のaddress
@param to 転送先のaddress
@param tokenId PERSONA ID
@param nonce 署名生成手順参照
@param sig 署名生成手順参照
function transferFrom(address from,address to,uint256 tokenId,uint256 nonce,bytes memory sig) public validToken(tokenId)
所有者以外のアドレスに特定のNFTの転送を承認する(Persona.sol)
@param to 転送先のaddress
@param tokenId PERSONA ID
function approve(address to,uint256 tokenId) public validToken(tokenId)
NFTの転送(Persona.sol)
@param from 転送元のaddress
@param to 転送先のaddress
@param tokenId PERSONA ID
function transferFrom(address from,address to,uint256 tokenId) public validToken(tokenId)
balance取得(Persona.sol)
@param ownerAddress 対象のaddress
@return 対象のaddressの保有Persona数
function balanceOf(address ownerAddress);
保有IDリスト取得(Persona.sol)
@param ownerAddress 対象のaddress
@param index 開始index
@param limit 最大取得数
@return 保有IDリスト
function tokenOfOwnerByIndexBatch(address ownerAddress, uint256 index, uint256 limit);