diff --git a/contract/contracts/LocalNounsToken.sol b/contract/contracts/LocalNounsToken.sol index 11d171dd..8ecbdf2d 100644 --- a/contract/contracts/LocalNounsToken.sol +++ b/contract/contracts/LocalNounsToken.sol @@ -18,19 +18,30 @@ contract LocalNounsToken is ProviderTokenA2, ILocalNounsToken { IAssetProviderExMint public assetProvider2; address public minter; mapping(uint256 => uint256[]) public tradePrefecture; // トレード先指定の都道府県 + mapping(uint256 => address) public tradeAddress; // トレード先指定のアドレス - address public administratorsAddress; // 運営ウォレット + address[] public royaltyAddresses; // ロイヤリティ送信先ウォレット + mapping(address => uint256) public royaltyRatio; // ロイヤリティ送信先ウォレットごとの割合 + uint256 royaltyRatioTotal; // royaltyRatioの合計(割戻用) + bool public canSetApproval = false; // setApprovalForAll, approveの可否 + + uint256 public tradeRoyalty = 0.003 ether; // P2Pトレードのロイヤリティ + uint256 public salesRoyaltyBasisPoint = 1000; // P2Pセールのロイヤリティ、購入価格の10% + + mapping(address => bool) public approveWhiteList; // Approveを許可するアドレスリスト constructor( IAssetProviderExMint _assetProvider, address _minter ) ProviderTokenA2(_assetProvider, 'Local Nouns', 'Local Nouns') { - description = 'Local Nouns Token.'; + description = 'Local Nouns'; assetProvider2 = _assetProvider; - // mintPrice = 1e13; // 0.001 ※ mintPriceは Minterコントラクトで制御するため使用しない - // mintLimit = 5000; ※ mintLimitは Minterコントラクトで制御するため使用しない minter = _minter; - administratorsAddress = msg.sender; + + // ロイヤリティ送信先(コンストラクタではデプロイアドレス100%) + royaltyAddresses = [msg.sender]; + royaltyRatio[msg.sender] = 1; + royaltyRatioTotal = 1; } function tokenName(uint256 _tokenId) internal pure override returns (string memory) { @@ -38,7 +49,7 @@ contract LocalNounsToken is ProviderTokenA2, ILocalNounsToken { } function tokenURI(uint256 _tokenId) public view override returns (string memory) { - require(_tokenId < _nextTokenId(), 'LocalNounsToken.tokenURI: nonexistent token'); + require(_tokenId < _nextTokenId(), 'nonexistent token'); (string memory svgPart, string memory tag) = assetProvider2.generateSVGPart(_tokenId); bytes memory image = bytes(svgPart); @@ -77,13 +88,17 @@ contract LocalNounsToken is ProviderTokenA2, ILocalNounsToken { uint256 _prefectureId, uint256 _amount ) public virtual returns (uint256 tokenId) { - require(msg.sender == minter || msg.sender == owner(), 'Sender is not minter nor owner'); + require(msg.sender == minter || msg.sender == owner(), 'Invalid sender'); require(_prefectureId % 100 <= 47, 'Invalid prefectureId'); + // リエントランシー対策のため状態変更を先に実施 + _safeMint(_to, _amount); + + uint256 startTokenId = _nextTokenId() - _amount; + for (uint256 i = 0; i < _amount; i++) { - assetProvider2.mint(_prefectureId, _nextTokenId() + i); + assetProvider2.mint(_prefectureId, startTokenId + i); } - _safeMint(_to, _amount); return _nextTokenId() - 1; } @@ -91,7 +106,7 @@ contract LocalNounsToken is ProviderTokenA2, ILocalNounsToken { address[] memory _to, uint256[] memory _prefectureId, uint256[] memory _amount - ) public onlyOwner returns (uint256 tokenId) { + ) external onlyOwner returns (uint256 tokenId) { // 引数の整合性チェック require(_to.length == _prefectureId.length && _to.length == _amount.length, 'Invalid Arrays length'); @@ -101,31 +116,51 @@ contract LocalNounsToken is ProviderTokenA2, ILocalNounsToken { return _nextTokenId() - 1; } - function mint() public payable override returns (uint256 tokenId) { - revert('Cannot use this function'); + function mint() public payable override returns (uint256) { + revert('Cannot use'); } - function setMinter(address _minter) public onlyOwner { + function setMinter(address _minter) external onlyOwner { minter = _minter; } - function setAdministratorsAddress(address _admin) external onlyOwner { - administratorsAddress = _admin; + function setCanSetAproval(bool _canSetApproval) external onlyOwner { + canSetApproval = _canSetApproval; + } + + function setApproveWhiteList(address _address, bool approve) external onlyOwner { + approveWhiteList[_address] = approve; + } + + function setRoyaltyAddresses(address[] memory _addr, uint256[] memory ratio) external onlyOwner { + // 引数の整合性チェック + require(_addr.length == ratio.length, 'Invalid Arrays length'); + royaltyAddresses = _addr; + royaltyRatioTotal = 0; + + for (uint256 i = 0; i < _addr.length; i++) { + royaltyRatio[_addr[i]] = ratio[i]; + royaltyRatioTotal += ratio[i]; + } } /** * @param _tokenId the token id for put on the trade list. * @param _prefectures prefectures that you want to trade. if you don't want specific prefecture, you don't need to set. + * @param _tradeAddress the address only who can trade. */ - function putTradeLocalNoun(uint256 _tokenId, uint256[] memory _prefectures) public { + function putTradeLocalNoun(uint256 _tokenId, uint256[] memory _prefectures, address _tradeAddress) public { for (uint256 i = 0; i < _prefectures.length; i++) { require(_prefectures[i] > 0 && _prefectures[i] <= 47, 'incorrect prefecutre id'); } super.putTrade(_tokenId, true); tradePrefecture[_tokenId] = _prefectures; + if (_tradeAddress != address(0)) { + tradeAddress[_tokenId] = _tradeAddress; + } - emit PutTradePrefecture(_tokenId, _prefectures); + emit PutTradePrefecture(_tokenId, _prefectures, _tradeAddress); } function getTradePrefectureFor(uint256 _tokenId) public view returns (uint256[] memory) { @@ -137,11 +172,20 @@ contract LocalNounsToken is ProviderTokenA2, ILocalNounsToken { uint256[] memory emptyArray; tradePrefecture[_tokenId] = emptyArray; + tradeAddress[_tokenId] = address(0); emit CancelTradePrefecture(_tokenId); } - function executeTradeLocalNoun(uint256 _myTokenId, uint256 _targetTokenId) public { + function executeTradeLocalNoun(uint256 _myTokenId, uint256 _targetTokenId) public payable { + require(msg.value >= tradeRoyalty, 'Insufficial royalty'); + + // tradeAddressがある場合はmsg.senderをチェック + require( + tradeAddress[_targetTokenId] == address(0) || msg.sender == tradeAddress[_targetTokenId], + 'Limited address can trade' + ); + // tradePrefectureがない場合は、希望都道府県がないためチェック不要 if (tradePrefecture[_targetTokenId].length > 0) { uint256 myTokenIdPrefecture = assetProvider2.getPrefectureId(_myTokenId); @@ -156,38 +200,81 @@ contract LocalNounsToken is ProviderTokenA2, ILocalNounsToken { } super.executeTrade(_myTokenId, _targetTokenId); + _processTradeRoyalty(msg.value); + emit ExecuteTrade(_targetTokenId, ownerOf(_targetTokenId), _myTokenId, ownerOf(_myTokenId)); } - function putTrade(uint256 _tokenId, bool _isOnTrade) public override { - revert('Cannot use this function'); + function putTrade(uint256, bool) public pure override { + revert('Cannot use'); } - function executeTrade(uint256 _myTokenId, uint256 _targetTokenId) public override { - revert('Cannot use this function'); + function executeTrade(uint256, uint256) public pure override { + revert('Cannot use'); + } + + function purchase(uint256 _tokenId, address _buyer, address _facilitator) external payable override { + super._purchase(_tokenId, _buyer, _facilitator); + emit Purchase(_tokenId, _buyer); } // transfer時はトレード解除 function _beforeTokenTransfers(address from, address to, uint256 startTokenId, uint256 quantity) internal override { uint256[] memory emptyArray; tradePrefecture[startTokenId] = emptyArray; + tradeAddress[startTokenId] = address(0); super._beforeTokenTransfers(from, to, startTokenId, quantity); } + function setTradeRoyalty(uint256 _royalty) external onlyOwner { + tradeRoyalty = _royalty; + } + + function setSalesRoyaltyBasisPoint(uint256 _bp) external onlyOwner { + salesRoyaltyBasisPoint = _bp; + } + // pay royalties to admin here - function _processRoyalty(uint _salesPrice, uint _tokenId) internal override returns (uint256 royalty) { - royalty = (_salesPrice * 50) / 1000; // 5.0% - address payable payableTo = payable(administratorsAddress); - payableTo.transfer(royalty); + function _processRoyalty(uint _salesPrice, uint) internal override returns (uint256 royalty) { + // royalty = (_salesPrice * 100) / 1000; // 10.0% + royalty = (_salesPrice * salesRoyaltyBasisPoint) / 10000; + _sendRoyalty(royalty); + } + + // pay royalties to admin here + function _processTradeRoyalty(uint _royalty) internal { + _sendRoyalty(_royalty); + } + + // send royalties to admin and developper + function _sendRoyalty(uint _royalty) internal { + for (uint256 i = 0; i < royaltyAddresses.length; i++) { + _trySendRoyalty(royaltyAddresses[i], (_royalty * royaltyRatio[royaltyAddresses[i]]) / royaltyRatioTotal); + } + } + + function _trySendRoyalty(address to, uint amount) internal { + (bool sent, ) = payable(to).call{ value: amount }(''); + require(sent, 'Failed to send'); } function withdraw() external payable onlyOwner { - require(administratorsAddress != address(0), "administratorsAddress shouldn't be 0"); - (bool sent, ) = payable(administratorsAddress).call{ value: address(this).balance }(''); - require(sent, 'failed to move fund to administratorsAddress contract'); + _sendRoyalty(address(this).balance); } - // iLocalNounsTokenでERC721のtotalSupplyを使用したいけど、二重継承でエラーになるので個別関数を準備 + // 二重継承でエラーになるので個別関数を準備 function totalSupply2() public view returns (uint256) { return super.totalSupply(); } + + // 誰もがトークンを承認できないようにする + function setApprovalForAll(address operator, bool approved) public override { + require(canSetApproval || approveWhiteList[operator], 'Not allowed to set approval for all'); + super.setApprovalForAll(operator, approved); + } + + // 特定のトークンの承認も不可能にする + function approve(address to, uint256 tokenId) public payable override { + require(canSetApproval || approveWhiteList[to], 'Not allowed to approve'); + super.approve(to, tokenId); + } } diff --git a/contract/contracts/localNouns/LocalNounsMinter.sol b/contract/contracts/localNouns/LocalNounsMinter.sol index 9195dce6..f369bae7 100644 --- a/contract/contracts/localNouns/LocalNounsMinter.sol +++ b/contract/contracts/localNouns/LocalNounsMinter.sol @@ -22,11 +22,14 @@ import './interfaces/ILocalNounsToken.sol'; import '../interfaces/ITokenGate.sol'; contract LocalNounsMinter is Ownable { + // Fires when the purchase executed + event MintSelectedPrefecture(uint256 prefectureId, uint256 amount, address minter); + ILocalNounsToken public token; ITokenGate public immutable tokenGate; - uint256 public mintPriceForSpecified = 0.003 ether; - uint256 public mintPriceForNotSpecified = 0.001 ether; + uint256 public mintPriceForSpecified = 0.03 ether; + uint256 public mintPriceForNotSpecified = 0.01 ether; uint256 public mintMax = 1500; @@ -82,14 +85,16 @@ contract LocalNounsMinter is Ownable { require(token.totalSupply2() + _amount <= mintMax, 'Over the mint limit'); uint256 mintPrice; - if(_prefectureId == 0){ + if (_prefectureId == 0) { mintPrice = mintPriceForNotSpecified; - }else{ + } else { mintPrice = mintPriceForSpecified; } require(msg.value >= mintPrice * _amount, 'Must send the mint price'); - return token.mintSelectedPrefecture(msg.sender, _prefectureId, _amount); + tokenId = token.mintSelectedPrefecture(msg.sender, _prefectureId, _amount); + + emit MintSelectedPrefecture(_prefectureId, _amount, msg.sender); } function withdraw() external payable onlyOwner { diff --git a/contract/contracts/localNouns/LocalNounsMinter2.sol b/contract/contracts/localNouns/LocalNounsMinter2.sol new file mode 100644 index 00000000..54bb581d --- /dev/null +++ b/contract/contracts/localNouns/LocalNounsMinter2.sol @@ -0,0 +1,145 @@ +// SPDX-License-Identifier: GPL-3.0 + +/// @title Interface for NounsSeeder + +/********************************* + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + * ░░░░░░█████████░░█████████░░░ * + * ░░░░░░██░░░████░░██░░░████░░░ * + * ░░██████░░░████████░░░████░░░ * + * ░░██░░██░░░████░░██░░░████░░░ * + * ░░██░░██░░░████░░██░░░████░░░ * + * ░░░░░░█████████░░█████████░░░ * + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ * + *********************************/ + +pragma solidity ^0.8.6; + +import { Ownable } from '@openzeppelin/contracts/access/Ownable.sol'; +import './interfaces/ILocalNounsToken.sol'; +import '../interfaces/ITokenGate.sol'; + +contract LocalNounsMinter2 is Ownable { + // Fires when the purchase executed + event MintSelectedPrefecture(uint256 prefectureId, uint256 amount, address minter); + + ILocalNounsToken public token; + ITokenGate public immutable tokenGate; + + address[] public royaltyAddresses; // ロイヤリティ送信先ウォレット + mapping(address => uint256) public royaltyRatio; // ロイヤリティ送信先ウォレットごとの割合 + uint256 royaltyRatioTotal; // royaltyRatioの合計(割戻用) + + uint256 public mintPriceForSpecified = 0.03 ether; + uint256 public mintPriceForNotSpecified = 0.01 ether; + + uint256 public mintMax = 1500; + + enum SalePhase { + Locked, + PreSale, + PublicSale + } + + SalePhase public phase = SalePhase.PublicSale; // セールフェーズ + + address public administratorsAddress; // 運営ウォレット + + constructor(ILocalNounsToken _token, ITokenGate _tokenGate) { + token = _token; + administratorsAddress = msg.sender; + tokenGate = _tokenGate; + + // ロイヤリティ送信先(コンストラクタではデプロイアドレス100%) + royaltyAddresses = [msg.sender]; + royaltyRatio[msg.sender] = 1; + royaltyRatioTotal = 1; + } + + function setMintMax(uint256 _mintMax) external onlyOwner { + mintMax = _mintMax; + } + + function setLocalNounsToken(ILocalNounsToken _token) external onlyOwner { + token = _token; + } + + function setMintPriceForSpecified(uint256 _price) external onlyOwner { + mintPriceForSpecified = _price; + } + + function setMintPriceForNotSpecified(uint256 _price) external onlyOwner { + mintPriceForNotSpecified = _price; + } + + function setPhase(SalePhase _phase) external onlyOwner { + phase = _phase; + } + + function setAdministratorsAddress(address _admin) external onlyOwner { + administratorsAddress = _admin; + } + + function mintSelectedPrefecture(uint256 _prefectureId, uint256 _amount) public payable returns (uint256 tokenId) { + return mintSelectedPrefecture2(_prefectureId, _amount, msg.sender); + } + + function mintSelectedPrefecture2( + uint256 _prefectureId, + uint256 _amount, + address _mintTo + ) public payable returns (uint256 tokenId) { + if (phase == SalePhase.Locked) { + revert('Sale is locked'); + } else if (phase == SalePhase.PreSale) { + require(tokenGate.balanceOf(msg.sender) > 0, 'TokenGate token is needed'); + } + + require(token.totalSupply2() + _amount <= mintMax, 'Over the mint limit'); + + uint256 mintPrice; + if (_prefectureId == 0) { + mintPrice = mintPriceForNotSpecified; + } else { + mintPrice = mintPriceForSpecified; + } + require(msg.value >= mintPrice * _amount, 'Must send the mint price'); + + tokenId = token.mintSelectedPrefecture(_mintTo, _prefectureId, _amount); + + _sendRoyalty(msg.value); + + emit MintSelectedPrefecture(_prefectureId, _amount, _mintTo); + } + + function withdraw() external payable onlyOwner { + _sendRoyalty(address(this).balance); + } + + // send royalties to admin and developper + function _sendRoyalty(uint _royalty) internal { + for (uint256 i = 0; i < royaltyAddresses.length; i++) { + _trySendRoyalty(royaltyAddresses[i], (_royalty * royaltyRatio[royaltyAddresses[i]]) / royaltyRatioTotal); + } + } + + function _trySendRoyalty(address to, uint amount) internal { + (bool sent, ) = payable(to).call{ value: amount }(''); + require(sent, 'Failed to send'); + } + + function setRoyaltyAddresses(address[] memory _addr, uint256[] memory ratio) external onlyOwner { + // 引数の整合性チェック + require(_addr.length == ratio.length, 'Invalid Arrays length'); + royaltyAddresses = _addr; + royaltyRatioTotal = 0; + + for (uint256 i = 0; i < _addr.length; i++) { + royaltyRatio[_addr[i]] = ratio[i]; + royaltyRatioTotal += ratio[i]; + } + } + +} diff --git a/contract/contracts/localNouns/LocalNounsProvider.sol b/contract/contracts/localNouns/LocalNounsProvider.sol index 0074defb..c8f07d94 100644 --- a/contract/contracts/localNouns/LocalNounsProvider.sol +++ b/contract/contracts/localNouns/LocalNounsProvider.sol @@ -37,8 +37,8 @@ contract LocalNounsProvider is IAssetProviderExMint, IERC165, Ownable { uint256 totalPrefectureRatio; uint256[5] ratioRank = [5, 4, 3, 3, 2]; - uint256[5] acumurationRatioRank; - uint256 acumurationRatioRankTotal; + uint256[5] accumulationRatioRank; + uint256 accumulationRatioRankTotal; mapping(uint256 => uint256[]) public prefectureRatio; constructor( @@ -109,8 +109,8 @@ contract LocalNounsProvider is IAssetProviderExMint, IERC165, Ownable { prefectureRatio[4] = [37, 5, 30, 19, 41, 18, 36, 39, 32, 31]; for (uint256 i = 0; i < ratioRank.length; i++) { - acumurationRatioRankTotal += ratioRank[i]; - acumurationRatioRank[i] = acumurationRatioRankTotal; + accumulationRatioRankTotal += ratioRank[i]; + accumulationRatioRank[i] = accumulationRatioRankTotal; } } @@ -184,31 +184,17 @@ contract LocalNounsProvider is IAssetProviderExMint, IERC165, Ownable { ); } - bool randomValueForTest = false; - - function setRandomValueForTest(bool _test) public onlyOwner { - randomValueForTest = _test; - } - // テスト用にpublic function determinePrefectureId(uint256 _assetId) public view returns (uint256) { - uint256 randomValue; - if (randomValueForTest) { - // For TEST - randomValue = _assetId; - } else { - // ブロック番号とアセット番号から計算した値 -> ランダム値 - randomValue = uint256(keccak256(abi.encodePacked(block.timestamp, _assetId))); - } - uint256 rank = randomValue % acumurationRatioRankTotal; - for (uint256 i = 0; i < acumurationRatioRank.length; i++) { - if (rank < acumurationRatioRank[i]) { + uint256 rank = _assetId % accumulationRatioRankTotal; + for (uint256 i = 0; i < accumulationRatioRank.length; i++) { + if (rank < accumulationRatioRank[i]) { rank = i; break; } } - return prefectureRatio[rank][randomValue % prefectureRatio[rank].length]; + return prefectureRatio[rank][_assetId % prefectureRatio[rank].length]; } function mint(uint256 _prefectureId, uint256 _assetId) external returns (uint256) { diff --git a/contract/contracts/localNouns/LocalNounsProvider2.sol b/contract/contracts/localNouns/LocalNounsProvider2.sol new file mode 100644 index 00000000..178a4d7d --- /dev/null +++ b/contract/contracts/localNouns/LocalNounsProvider2.sol @@ -0,0 +1,232 @@ +// SPDX-License-Identifier: MIT + +/* + * Created by @eiba8884 + */ + +pragma solidity ^0.8.6; + +import { Ownable } from '@openzeppelin/contracts/access/Ownable.sol'; +import './interfaces/IAssetProviderExMint.sol'; +import '@openzeppelin/contracts/utils/Strings.sol'; +import '@openzeppelin/contracts/interfaces/IERC165.sol'; +import 'randomizer.sol/Randomizer.sol'; + +import { INounsDescriptor } from './interfaces/INounsDescriptor.sol'; +import { INounsSeeder } from './interfaces/INounsSeeder.sol'; + +contract LocalNounsProvider2 is IAssetProviderExMint, IERC165, Ownable { + using Strings for uint256; + using Randomizer for Randomizer.Seed; + + string constant providerKey = 'LocalNouns'; + address public receiver; + + uint256 public nextTokenId; + + INounsDescriptor public immutable descriptor; + INounsDescriptor public immutable localDescriptor; + + mapping(uint256 => uint256) public tokenIdToPrefectureId; + mapping(uint256 => string) public prefectureName; + mapping(uint256 => uint256) public mintNumberPerPrefecture; // 都道府県ごとのミント数 + // mapping(uint256 => uint256) public prefectureRatio; // ランダムミント時に決定される都道府県の割合 + uint256 totalPrefectureRatio; + + uint256[5] ratioRank = [5, 4, 3, 3, 2]; + uint256[5] accumulationRatioRank; + uint256 accumulationRatioRankTotal; + mapping(uint256 => uint256[]) public prefectureRatio; + + constructor(INounsDescriptor _descriptor, INounsDescriptor _localDescriptor) { + receiver = owner(); + + descriptor = _descriptor; + localDescriptor = _localDescriptor; + + prefectureName[1] = 'Hokkaido'; + prefectureName[2] = 'Aomori'; + prefectureName[3] = 'Iwate'; + prefectureName[4] = 'Miyagi'; + prefectureName[5] = 'Akita'; + prefectureName[6] = 'Yamagata'; + prefectureName[7] = 'Fukushima'; + prefectureName[8] = 'Ibaraki'; + prefectureName[9] = 'Tochigi'; + prefectureName[10] = 'Gunma'; + prefectureName[11] = 'Saitama'; + prefectureName[12] = 'Chiba'; + prefectureName[13] = 'Tokyo'; + prefectureName[14] = 'Kanagawa'; + prefectureName[15] = 'Niigata'; + prefectureName[16] = 'Toyama'; + prefectureName[17] = 'Ishikawa'; + prefectureName[18] = 'Fukui'; + prefectureName[19] = 'Yamanashi'; + prefectureName[20] = 'Nagano'; + prefectureName[21] = 'Gifu'; + prefectureName[22] = 'Shizuoka'; + prefectureName[23] = 'Aichi'; + prefectureName[24] = 'Mie'; + prefectureName[25] = 'Shiga'; + prefectureName[26] = 'Kyoto'; + prefectureName[27] = 'Osaka'; + prefectureName[28] = 'Hyogo'; + prefectureName[29] = 'Nara'; + prefectureName[30] = 'Wakayama'; + prefectureName[31] = 'Tottori'; + prefectureName[32] = 'Shimane'; + prefectureName[33] = 'Okayama'; + prefectureName[34] = 'Hiroshima'; + prefectureName[35] = 'Yamaguchi'; + prefectureName[36] = 'Tokushima'; + prefectureName[37] = 'Kagawa'; + prefectureName[38] = 'Ehime'; + prefectureName[39] = 'Kochi'; + prefectureName[40] = 'Fukuoka'; + prefectureName[41] = 'Saga'; + prefectureName[42] = 'Nagasaki'; + prefectureName[43] = 'Kumamoto'; + prefectureName[44] = 'Oita'; + prefectureName[45] = 'Miyazaki'; + prefectureName[46] = 'Kagoshima'; + prefectureName[47] = 'Okinawa'; + + prefectureRatio[0] = [13, 14, 27, 23, 11, 12, 28, 1, 40]; + prefectureRatio[1] = [22, 8, 34, 26, 4, 15, 20, 21, 10]; + prefectureRatio[2] = [9, 33, 7, 24, 43, 46, 47, 25, 35]; + prefectureRatio[3] = [29, 38, 42, 2, 3, 17, 44, 45, 6, 16]; + prefectureRatio[4] = [37, 5, 30, 19, 41, 18, 36, 39, 32, 31]; + + for (uint256 i = 0; i < ratioRank.length; i++) { + accumulationRatioRankTotal += ratioRank[i]; + accumulationRatioRank[i] = accumulationRatioRankTotal; + } + } + + function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + return interfaceId == type(IAssetProvider).interfaceId || interfaceId == type(IERC165).interfaceId; + } + + function getOwner() external view override returns (address) { + return owner(); + } + + function getProviderInfo() external view override returns (ProviderInfo memory) { + return ProviderInfo(providerKey, 'Logo', this); + } + + function totalSupply() external pure override returns (uint256) { + return 0; // indicating "dynamically (but deterministically) generated from the given assetId) + } + + function processPayout(uint256 _assetId) external payable override { + address payable payableTo = payable(receiver); + payableTo.transfer(msg.value); + emit Payout(providerKey, _assetId, payableTo, msg.value); + } + + function setReceiver(address _receiver) external onlyOwner { + receiver = _receiver; + } + + function generateSeed( + uint256 prefectureId, + uint256 _assetId + ) internal view returns (INounsSeeder.Seed memory mixedSeed) { + uint256 pseudorandomness; + Randomizer.Seed memory seed = Randomizer.Seed(_assetId, 0); + + // LocalNounsのヘッドを決定 + uint256 headCount = localDescriptor.headCountInPrefecture(prefectureId); + (seed, pseudorandomness) = seed.random(headCount); + uint256 headPartId = localDescriptor.headInPrefecture(prefectureId, pseudorandomness); + + // LocalNounsのアクセサリを決定 + uint256 accessoryCount = localDescriptor.accessoryCountInPrefecture(prefectureId % 100); // 1,2桁目:都道府県番号、3桁目以降:バージョン番号 + (seed, pseudorandomness) = seed.random(accessoryCount); + uint256 accesoryPartId = localDescriptor.accessoryInPrefecture(prefectureId % 100, pseudorandomness); + + // Nounsのバックグラウンドを決定 + uint256 backgroundCount = descriptor.backgroundCount(); + (seed, pseudorandomness) = seed.random(backgroundCount); + uint256 backgroundPartId = pseudorandomness; + + // Nounsのボディを決定 + uint256 bodyCount = descriptor.bodyCount(); + (seed, pseudorandomness) = seed.random(bodyCount); + uint256 bodyPartId = pseudorandomness; + + // Nounsのグラスを決定 + uint256 glassesCount = descriptor.glassesCount(); + (seed, pseudorandomness) = seed.random(glassesCount); + uint256 glassesPartId = pseudorandomness; + + mixedSeed = INounsSeeder.Seed({ + background: uint48(backgroundPartId), + body: uint48(bodyPartId), + accessory: uint48(accesoryPartId), + head: uint48(headPartId), + glasses: uint48(glassesPartId) + }); + } + + function generateSVGPart(uint256 _assetId) public view override returns (string memory svgPart, string memory tag) { + INounsSeeder.Seed memory seed = generateSeed(tokenIdToPrefectureId[_assetId], _assetId); + + svgPart = localDescriptor.generateSVGImage(seed); + tag = string(''); + } + + function generateTraits(uint256 _assetId) external view override returns (string memory traits) { + INounsSeeder.Seed memory seed = generateSeed(tokenIdToPrefectureId[_assetId], _assetId); + + uint256 headPartsId = seed.head; + uint256 accessoryPartsId = seed.accessory; + traits = string( + abi.encodePacked( + '{"trait_type": "prefecture" , "value":"', + prefectureName[tokenIdToPrefectureId[_assetId] % 100], + '"}', + ',{"trait_type": "head" , "value":"', + localDescriptor.headName(headPartsId), + '"}', + ',{"trait_type": "accessory" , "value":"', + localDescriptor.accessoryName(accessoryPartsId), + '"}' + ) + ); + } + + // テスト用にpublic + function determinePrefectureId(uint256 _assetId) public view returns (uint256) { + uint256 rank = _assetId % accumulationRatioRankTotal; + for (uint256 i = 0; i < accumulationRatioRank.length; i++) { + if (rank < accumulationRatioRank[i]) { + rank = i; + break; + } + } + return prefectureRatio[rank][_assetId % prefectureRatio[rank].length]; + } + + function mint(uint256 _prefectureId, uint256 _assetId) external returns (uint256) { + uint256 prefectureId; + // 末尾2桁が00の場合は都道府県をランダムに決定する + if (_prefectureId % 100 == 0) { + prefectureId = _prefectureId + determinePrefectureId(_assetId); + } else { + prefectureId = _prefectureId; + } + + tokenIdToPrefectureId[_assetId] = prefectureId; + mintNumberPerPrefecture[prefectureId % 100]++; + nextTokenId++; + + return _assetId; + } + + function getPrefectureId(uint256 _tokenId) external view override returns (uint256) { + return tokenIdToPrefectureId[_tokenId]; + } +} diff --git a/contract/contracts/localNouns/LocalNounsSeeder.sol b/contract/contracts/localNouns/LocalNounsSeeder.sol index cd7a847a..04928d38 100644 --- a/contract/contracts/localNouns/LocalNounsSeeder.sol +++ b/contract/contracts/localNouns/LocalNounsSeeder.sol @@ -21,26 +21,22 @@ import { ILocalNounsSeeder } from './interfaces/ILocalNounsSeeder.sol'; import { INounsDescriptorMinimal } from './interfaces/INounsDescriptorMinimal.sol'; contract LocalNounsSeeder is ILocalNounsSeeder { - /** - * @notice Generate a pseudo-random Noun seed using the previous blockhash and noun ID. - */ - function generateSeed(uint256 prefectureId, uint256 nounId, INounsDescriptorMinimal descriptor) external view returns (Seed memory) { - uint256 pseudorandomness = uint256( - keccak256(abi.encodePacked(blockhash(block.number - 1), nounId)) - ); - - uint256 accessoryCount = descriptor.accessoryCountInPrefecture(prefectureId % 100); // 1,2桁目:都道府県番号、3桁目以降:バージョン番号 - uint256 headCount = descriptor.headCountInPrefecture(prefectureId); - - uint256 accesoryPartId = descriptor.accessoryInPrefecture(prefectureId % 100, (pseudorandomness >> 96) % accessoryCount); - uint256 headPartId = descriptor.headInPrefecture(prefectureId, (pseudorandomness >> 144) % headCount); - - return Seed({ - background: 0, - body: 0, - accessory: uint48(accesoryPartId), - head: uint48(headPartId), - glasses: 0 - }); - } + /** + * @notice Generate a pseudo-random Noun seed using the previous blockhash and noun ID. + */ + function generateSeed( + uint256 prefectureId, + uint256 nounId, + INounsDescriptorMinimal descriptor + ) external view returns (Seed memory) { + uint256 pseudorandomness = (block.number - 1) + nounId; + + uint256 accessoryCount = descriptor.accessoryCountInPrefecture(prefectureId % 100); // 1,2桁目:都道府県番号、3桁目以降:バージョン番号 + uint256 headCount = descriptor.headCountInPrefecture(prefectureId); + + uint256 accesoryPartId = descriptor.accessoryInPrefecture(prefectureId % 100, pseudorandomness % accessoryCount); + uint256 headPartId = descriptor.headInPrefecture(prefectureId, pseudorandomness % headCount); + + return Seed({ background: 0, body: 0, accessory: uint48(accesoryPartId), head: uint48(headPartId), glasses: 0 }); + } } diff --git a/contract/contracts/localNouns/interfaces/ILocalNounsToken.sol b/contract/contracts/localNouns/interfaces/ILocalNounsToken.sol index f756793d..345de18e 100644 --- a/contract/contracts/localNouns/interfaces/ILocalNounsToken.sol +++ b/contract/contracts/localNouns/interfaces/ILocalNounsToken.sol @@ -26,8 +26,15 @@ interface ILocalNounsToken { function totalSupply2() external returns (uint256); // Fires when the owner puts the trade - event PutTradePrefecture(uint256 indexed tokenId, uint256[] _prefectures); + event PutTradePrefecture(uint256 indexed tokenId, uint256[] _prefectures, address _tradeAddress); // Fires when the owner cancel the trade event CancelTradePrefecture(uint256 indexed tokenId); + + // Fires when the purchase executed + event Purchase(uint256 indexed tokenId, address _buyer); + + // Fires when the trade executed + event ExecuteTrade(uint256 indexed targetTokenId, address _lister, uint256 indexed ownedTokenId, address _executer); + } diff --git a/contract/contracts/packages/ERC721P2P/ERC721AP2P.sol b/contract/contracts/packages/ERC721P2P/ERC721AP2P.sol index 7c19098f..771a0a68 100644 --- a/contract/contracts/packages/ERC721P2P/ERC721AP2P.sol +++ b/contract/contracts/packages/ERC721P2P/ERC721AP2P.sol @@ -28,7 +28,11 @@ abstract contract ERC721AP2P is IERC721P2PCore, ERC721A, Ownable { return prices[_tokenId]; } - function purchase(uint256 _tokenId, address _buyer, address _facilitator) external payable override { + function purchase(uint256 _tokenId, address _buyer, address _facilitator) external payable virtual { + _purchase(_tokenId, _buyer, _facilitator); + } + + function _purchase(uint256 _tokenId, address _buyer, address _facilitator) internal { uint256 price = prices[_tokenId]; require(price > 0, 'Token is not on sale'); require(msg.value >= price, 'Not enough fund'); @@ -68,5 +72,4 @@ abstract contract ERC721AP2P is IERC721P2PCore, ERC721A, Ownable { setPriceOf(_tokenId, _price); _dealer.acceptOffer(this, _tokenId, _price); } - } diff --git a/contract/hardhat.config.ts b/contract/hardhat.config.ts index 588312a0..ddead97c 100644 --- a/contract/hardhat.config.ts +++ b/contract/hardhat.config.ts @@ -12,7 +12,19 @@ const getUrl = () => { }; const config: HardhatUserConfig = { - solidity: "0.8.17", + solidity: { + version: "0.8.17", + settings: { + optimizer: { + enabled: true, + details: { + yulDetails: { + optimizerSteps: "u", + }, + }, + }, + } + }, defaultNetwork: "localhost", networks: { polygon: { @@ -25,6 +37,7 @@ const config: HardhatUserConfig = { mumbai: { // url: "https://rpc-mumbai.maticvigil.com", url: "https://polygon-mumbai.g.alchemy.com/v2/" + process.env.ALCHEMY_API_KEY, + gasMultiplier: 1.3, accounts: process.env.PRIVATE_KEY !== undefined ? [process.env.PRIVATE_KEY] : [], }, @@ -41,8 +54,8 @@ const config: HardhatUserConfig = { process.env.PRIVATE_KEY !== undefined ? [process.env.PRIVATE_KEY] : [], }, mainnet: { - url: "https://eth-mainnet.alchemyapi.io/v2/" + process.env.ALCHEMY_API_KEY, - gasMultiplier: 1.2, + url: "https://eth-mainnet.g.alchemy.com/v2/" + process.env.ALCHEMY_API_KEY, + gasMultiplier: 1.1, accounts: process.env.PRIVATE_KEY !== undefined ? [process.env.PRIVATE_KEY] : [], } diff --git a/contract/scripts/deploy_localNouns.ts b/contract/scripts/deploy_localNouns.ts index 59ce8bad..6e7e0ee1 100644 --- a/contract/scripts/deploy_localNouns.ts +++ b/contract/scripts/deploy_localNouns.ts @@ -4,7 +4,6 @@ import { writeFile } from 'fs'; import { addresses } from '../../src/utils/addresses'; const nounsDescriptor = addresses.nounsDescriptor[network.name]; -const nounsSeeder = addresses.nounsSeeder[network.name]; const nftDescriptor = addresses.nftDescriptor[network.name]; async function main() { @@ -15,16 +14,10 @@ async function main() { const factoryTokenGate = await ethers.getContractFactory('AssetTokenGate'); const tokenGate = await factoryTokenGate.deploy(); await tokenGate.deployed(); - - const factorySeeder = await ethers.getContractFactory('LocalNounsSeeder'); - const localseeder = await factorySeeder.deploy(); - await localseeder.deployed(); - console.log(`##localseeder="${localseeder.address}"`); - await runCommand(`npx hardhat verify ${localseeder.address} --network ${network.name} &`); - - const addresses = `export const addresses = {\n` + ` localseeder:"${localseeder.address}",\n` + `}\n`; - await writeFile(`../src/utils/addresses/localseeder_${network.name}.ts`, addresses, () => { }); - + console.log(`##tokenGate="${tokenGate.address}"`); + await runCommand(`npx hardhat verify ${tokenGate.address} --network ${network.name} &`); + const addresses0 = `export const addresses = {\n` + ` tokenGate:"${tokenGate.address}",\n` + `}\n`; + await writeFile(`../src/utils/addresses/tokenGate_${network.name}.ts`, addresses0, () => { }); const factoryLocalNounsDescriptor = await ethers.getContractFactory('LocalNounsDescriptor', { libraries: { @@ -42,11 +35,11 @@ async function main() { await writeFile(`../src/utils/addresses/localNounsDescriptor_${network.name}.ts`, addresses2, () => { }); - const factorySVGStore = await ethers.getContractFactory('LocalNounsProvider'); - const provider = await factorySVGStore.deploy(nounsDescriptor, localNounsDescriptor.address, nounsSeeder, localseeder.address); + const factoryProvider = await ethers.getContractFactory('LocalNounsProvider2'); + const provider = await factoryProvider.deploy(nounsDescriptor, localNounsDescriptor.address); await provider.deployed(); console.log(`##LocalNounsProvider="${provider.address}"`); - await runCommand(`npx hardhat verify ${provider.address} ${nounsDescriptor} ${localNounsDescriptor.address} ${nounsSeeder} ${localseeder.address} --network ${network.name} &`); + await runCommand(`npx hardhat verify ${provider.address} ${nounsDescriptor} ${localNounsDescriptor.address} --network ${network.name} &`); const addresses3 = `export const addresses = {\n` + ` localNounsProvider:"${provider.address}",\n` + `}\n`; await writeFile(`../src/utils/addresses/localNounsProvider_${network.name}.ts`, addresses3, () => { }); @@ -64,7 +57,7 @@ async function main() { const minterContract = await factoryMinter.deploy(token.address, tokenGate.address); await minterContract.deployed(); console.log(`##LocalNounsMinter="${minterContract.address}"`); - await runCommand(`npx hardhat verify ${minterContract.address} ${token.address} --network ${network.name} &`); + await runCommand(`npx hardhat verify ${minterContract.address} ${token.address} ${tokenGate.address} --network ${network.name} &`); const addresses5 = `export const addresses = {\n` + ` localNounsMinter:"${minterContract.address}",\n` + `}\n`; await writeFile(`../src/utils/addresses/localNounsMinter_${network.name}.ts`, addresses5, () => { }); diff --git a/contract/scripts/deploy_localNounsMinter2.ts b/contract/scripts/deploy_localNounsMinter2.ts new file mode 100644 index 00000000..3faa86ae --- /dev/null +++ b/contract/scripts/deploy_localNounsMinter2.ts @@ -0,0 +1,31 @@ +// LocalNounsTokenとLocalNounsProviderのみデプロイ +import { ethers, network } from 'hardhat'; +import { writeFile } from 'fs'; +import { addresses } from '../../src/utils/addresses'; + +const localNounsTokenAddress = addresses.localNounsToken[network.name]; +const tokenGateAddress = addresses.tokenGate[network.name]; + +async function main() { + + const factoryMinter = await ethers.getContractFactory('LocalNounsMinter2'); + const minterContract = await factoryMinter.deploy(localNounsTokenAddress, tokenGateAddress); + await minterContract.deployed(); + console.log(`##LocalNounsMinter="${minterContract.address}"`); + await runCommand(`npx hardhat verify ${minterContract.address} ${localNounsTokenAddress} ${tokenGateAddress} --network ${network.name} &`); + + const addresses5 = `export const addresses = {\n` + ` localNounsMinter:"${minterContract.address}",\n` + `}\n`; + await writeFile(`../src/utils/addresses/localNounsMinter_${network.name}.ts`, addresses5, () => { }); + +} + +async function runCommand(command: string) { + if (network.name !== 'localhost') { + console.log(command); + } +} + +main().catch(error => { + console.error(error); + process.exitCode = 1; +}); \ No newline at end of file diff --git a/contract/scripts/deploy_localNounsProvider2.ts b/contract/scripts/deploy_localNounsProvider2.ts new file mode 100644 index 00000000..8ae04d7c --- /dev/null +++ b/contract/scripts/deploy_localNounsProvider2.ts @@ -0,0 +1,55 @@ +// LocalNounsTokenとLocalNounsProviderのみデプロイ +import { ethers, network } from 'hardhat'; +import { writeFile } from 'fs'; +import { addresses } from '../../src/utils/addresses'; + +const nounsDescriptor = addresses.nounsDescriptor[network.name]; +const localNounsDescriptor = addresses.localNounsDescriptor[network.name]; +const localNounsMinterAddress = addresses.localNounsMinter[network.name]; +const tokenGateAddress = addresses.tokenGate[network.name]; + +async function main() { + + const factoryProvider = await ethers.getContractFactory('LocalNounsProvider2'); + const provider = await factoryProvider.deploy(nounsDescriptor, localNounsDescriptor); + await provider.deployed(); + console.log(`##LocalNounsProvider="${provider.address}"`); + await runCommand(`npx hardhat verify ${provider.address} ${nounsDescriptor} ${localNounsDescriptor} --network ${network.name} &`); + + const addresses3 = `export const addresses = {\n` + ` localNounsProvider:"${provider.address}",\n` + `}\n`; + await writeFile(`../src/utils/addresses/localNounsProvider_${network.name}.ts`, addresses3, () => { }); + + + const factoryToken = await ethers.getContractFactory('LocalNounsToken'); + const token = await factoryToken.deploy(provider.address, localNounsMinterAddress); + await token.deployed(); + console.log(`##LocalNounsToken="${token.address}"`); + await runCommand(`npx hardhat verify ${token.address} ${provider.address} ${localNounsMinterAddress} --network ${network.name} &`); + + const addresses4 = `export const addresses = {\n` + ` localNounsToken:"${token.address}",\n` + `}\n`; + await writeFile(`../src/utils/addresses/localNounsToken_${network.name}.ts`, addresses4, () => { }); + + const factoryMinter = await ethers.getContractFactory('LocalNounsMinter'); + const minterContract = await factoryMinter.deploy(token.address, tokenGateAddress); + await minterContract.deployed(); + console.log(`##LocalNounsMinter="${minterContract.address}"`); + await runCommand(`npx hardhat verify ${minterContract.address} ${token.address} ${tokenGateAddress} --network ${network.name} &`); + + const addresses5 = `export const addresses = {\n` + ` localNounsMinter:"${minterContract.address}",\n` + `}\n`; + await writeFile(`../src/utils/addresses/localNounsMinter_${network.name}.ts`, addresses5, () => { }); + + await token.setMinter(minterContract.address); + + +} + +async function runCommand(command: string) { + if (network.name !== 'localhost') { + console.log(command); + } +} + +main().catch(error => { + console.error(error); + process.exitCode = 1; +}); \ No newline at end of file diff --git a/contract/scripts/localNouns/airdrop_localNouns.ts b/contract/scripts/localNouns/airdrop_localNouns.ts new file mode 100644 index 00000000..d2f099b1 --- /dev/null +++ b/contract/scripts/localNouns/airdrop_localNouns.ts @@ -0,0 +1,57 @@ +// import * as dotenv from "dotenv"; +import { ethers, network } from 'hardhat'; +import { addresses } from '../../../src/utils/addresses'; + +import { abi as localTokenABI } from "../artifacts/contracts/LocalNounsToken.sol/LocalNounsToken"; + +const localTokenAddress = addresses.localNounsToken[network.name]; + +async function main() { + + let wallet; + if (network.name == 'localhost') { + [wallet] = await ethers.getSigners(); // localhost + } else { + const privateKey = process.env.PRIVATE_KEY !== undefined ? process.env.PRIVATE_KEY : ''; + wallet = new ethers.Wallet(privateKey, ethers.provider); + + } + + // ethers.Contract オブジェクトのインスタンスを作成 + const localToken = new ethers.Contract(localTokenAddress, localTokenABI, wallet); + + let tx; + + // 実行委員へミント + const mintNumForPrefecture = [ + // ['0x4eA84A06F011495B99Aa7202fDca60443107042F',0,3], 【済】 + // ['0x84296321A9Bb88Be24df53d6AbB308f94e44c13A',0,3], 【済】 + // ['0x3E1dc89ab1E3BB8A64bB0f65b65b404f1BF708c3',0,6], 【済】 + // ['0x7AB60415A6712d15DcA1E08E9B72a56b8cC97c77',0,3], 【済】 + // ['0x2072C081C77A476c28d4B2e0F86ED8A789BD8078',0,3], 【済】 + // ['0x4F4bD77781cEeE4914B6bC16633D5437eaBCa5D3',0,3],【済】 + // ['0x39a3e7812F7d5851fc557C550E08Fa75700941E1',0,3],【済】 + ['0x9Cc1d4AF4BD2F9123e66433313be82aFa802393f',0,3], + // ['0xBc7dC395762d1268d51F8480F9e7e892cAd9175b',0,3], 【済】 + ]; + + for (var i = 0; i < mintNumForPrefecture.length; i++) { + try { + tx = await localToken.functions['ownerMint']([mintNumForPrefecture[i][0]], [mintNumForPrefecture[i][1]], [mintNumForPrefecture[i][2]]); + console.log("mint:", mintNumForPrefecture[i], tx.hash); + } catch (error) { + console.log("mint error:", mintNumForPrefecture[i], tx.hash); + // console.error(error); + }; + await sleep(1000); // 1秒待機 + } +} + +function sleep(ms: number): Promise { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +main().catch(error => { + console.error(error); + process.exitCode = 1; +}); diff --git a/contract/scripts/localNouns/putTrade_localNouns.ts b/contract/scripts/localNouns/putTrade_localNouns.ts new file mode 100644 index 00000000..6e88f6dd --- /dev/null +++ b/contract/scripts/localNouns/putTrade_localNouns.ts @@ -0,0 +1,55 @@ +/* +npx hardhat run scripts/localNouns/putTrade_localNouns.ts --network mainnet +*/ +// import * as dotenv from "dotenv"; +import { ethers, network } from 'hardhat'; +import { addresses } from '../../../src/utils/addresses'; + +import { abi as localTokenABI } from "../../artifacts/contracts/LocalNounsToken.sol/LocalNounsToken"; + +const localTokenAddress = addresses.localNounsToken[network.name]; + +async function main() { + + let wallet; + if (network.name == 'localhost') { + [wallet] = await ethers.getSigners(); // localhost + } else { + const privateKey = process.env.PRIVATE_KEY !== undefined ? process.env.PRIVATE_KEY : ''; + wallet = new ethers.Wallet(privateKey, ethers.provider); + + } + + // ethers.Contract オブジェクトのインスタンスを作成 + const localToken = new ethers.Contract(localTokenAddress, localTokenABI, wallet); + + let tx; + + // トレードへリスト + const tradeList = [ + [79,[],'0xA5cdC559386d8A5c89671628804234B8cb43bbb9'], +[85,[],'0xA5cdC559386d8A5c89671628804234B8cb43bbb9'], +[88,[],'0xA5cdC559386d8A5c89671628804234B8cb43bbb9'], +[111,[],'0xA5cdC559386d8A5c89671628804234B8cb43bbb9'], + ]; + + for (var i = 0; i < tradeList.length; i++) { + try { + tx = await localToken.functions['putTradeLocalNoun'](tradeList[i][0], tradeList[i][1], tradeList[i][2]); + console.log("trade:", tradeList[i], tx.hash); + } catch (error) { + console.log("trade error:", tradeList[i], error); + // console.error(error); + }; + await sleep(1000); // 1秒待機 + } +} + +function sleep(ms: number): Promise { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +main().catch(error => { + console.error(error); + process.exitCode = 1; +}); diff --git a/contract/scripts/populate_localNouns.ts b/contract/scripts/populate_localNouns.ts index 307cf715..e69de29b 100644 --- a/contract/scripts/populate_localNouns.ts +++ b/contract/scripts/populate_localNouns.ts @@ -1,126 +0,0 @@ -import * as dotenv from "dotenv"; -import { ethers, network } from 'hardhat'; -import { addresses } from '../../src/utils/addresses'; - -const nounsDescriptor = addresses.nounsDescriptor[network.name]; - -import { images, palette } from "../test/image-local-data"; -import { abi as localSeederABI } from "../artifacts/contracts/localNouns/LocalNounsSeeder.sol/LocalNounsSeeder"; -import { abi as localNounsDescriptorABI } from "../artifacts/contracts/localNouns/LocalNounsDescriptor.sol/LocalNounsDescriptor"; -import { abi as localProviderABI } from "../artifacts/contracts/localNouns/LocalNounsProvider.sol/LocalNounsProvider"; -import { abi as localTokenABI } from "../artifacts/contracts/LocalNounsToken.sol/LocalNounsToken"; -import { abi as localMinterABI } from "../artifacts/contracts/localNouns/LocalNounsMinter.sol/LocalNounsMinter"; - -dotenv.config(); - - -const localSeederAddress = addresses.localSeeder[network.name]; -const localNounsDescriptorAddress = addresses.localNounsDescriptor[network.name]; -const localProviderAddress = addresses.localProvider[network.name]; -const localTokenAddress = addresses.localNounsToken[network.name]; -const localMinterAddress = addresses.localNounsMinter[network.name]; - -async function main() { - - // const privateKey = process.env.PRIVATE_KEY !== undefined ? process.env.PRIVATE_KEY : ''; - // const wallet = new ethers.Wallet(privateKey, ethers.provider); - const [wallet] = await ethers.getSigners(); // localhost - - // ethers.Contract オブジェクトのインスタンスを作成 - const localSeeder = new ethers.Contract(localSeederAddress, localSeederABI, wallet); - const localNounsDescriptor = new ethers.Contract(localNounsDescriptorAddress, localNounsDescriptorABI, wallet); - const localProvider = new ethers.Contract(localProviderAddress, localProviderABI, wallet); - const localToken = new ethers.Contract(localTokenAddress, localTokenABI, wallet); - const localMinter = new ethers.Contract(localMinterAddress, localMinterABI, wallet); - - if (true) { - // set Palette - console.log(`set Palette start`); - await localNounsDescriptor.addManyColorsToPalette(0, palette); - console.log(`set Palette end`); - - // set Accessories - console.log(`set Accessories start`); - const accessoryChunk = chunkArrayByPrefectureId(images.accessories); - for (const chunk of accessoryChunk) { - const prefectureId = chunk[0].prefectureId; - await localNounsDescriptor.addManyAccessories(prefectureId, chunk.map(({ data }) => data), chunk.map(({ filename }) => filename)); - // console.log("chunk:", prefectureId, chunk); - } - console.log(`set Accessories end`); - - // set Heads - console.log(`set Heads start`); - const headChunk = chunkArrayByPrefectureId(images.heads); - for (const chunk of headChunk) { - const prefectureId = chunk[0].prefectureId; - await localNounsDescriptor.addManyHeads(prefectureId, chunk.map(({ data }) => data), chunk.map(({ filename }) => filename)); - // console.log("chunk:", prefectureId, chunk); - } - console.log(`set Heads end`); - - } - - // for (var i: number = 1; i <= 47; i++) { - // try { - // await localMinter.functions['mintSelectedPrefecture(uint256)'](ethers.BigNumber.from(String(i)), { value: ethers.utils.parseEther('0.000001') }); - - // console.log(`mint [`, i, `]`); - // } catch (error) { - // console.error(error); - // }; - // } - - // console.log(`write file start`); - // const index = 0; - // const ret = await localToken.tokenURI(index); - // const json = Buffer.from(ret.split(",")[1], 'base64').toString(); - // const svgB = Buffer.from(JSON.parse(json)["image"].split(",")[1], 'base64').toString(); - // const svg = Buffer.from(svgB, 'base64').toString(); - // // fs.writeFileSync(`./svg/${index}.svg`, svg, { encoding: 'utf8' }); - // console.log(`write file end`); - -} - -main().catch(error => { - console.error(error); - process.exitCode = 1; -}); - -interface ImageData { - prefectureId: string; - filename: string; - data: string; -} - -function chunkArrayByPrefectureId(imagedata: ImageData[]): ImageData[][] { - let map = new Map(); - - for (let i = 0; i < imagedata.length; i++) { - // dataが空っぽはスキップ - if (imagedata[i].data === undefined) { - console.error("not define data:", imagedata[i].filename); - continue; - } - - let filename = imagedata[i].filename.split('-'); - let id = filename[0]; - imagedata[i].prefectureId = id; - - // filenameの抽出 ex)"35-yamaguchi-white -snake-accessories" -> "white-snake" - let name = ''; - for (var j = 2; j < filename.length - 1; j++) { - if (name.length > 0) { - name += '-'; - } - name += filename[j].trim(); - } - imagedata[i].filename = name; - console.log("imagedata[i].filename", imagedata[i].filename); - if (!map.has(id)) { - map.set(id, []); - } - map.get(id)!.push(imagedata[i]); - } - return Array.from(map.values()); -} \ No newline at end of file diff --git a/contract/scripts/populate_localNouns2.ts b/contract/scripts/populate_localNouns2.ts index 2d26396a..1ec74352 100644 --- a/contract/scripts/populate_localNouns2.ts +++ b/contract/scripts/populate_localNouns2.ts @@ -36,14 +36,16 @@ async function main() { const localToken = new ethers.Contract(localTokenAddress, localTokenABI, wallet); const localMinter = new ethers.Contract(localMinterAddress, localMinterABI, wallet); + let tx; if (true) { // set Heads console.log(`set Heads start`); const headChunk = chunkArrayByPrefectureId(images.heads); for (const chunk of headChunk) { const prefectureId = chunk[0].prefectureId; - await localNounsDescriptor.addManyHeads(prefectureId, chunk.map(({ data }) => data), chunk.map(({ filename }) => filename)); + tx = await localNounsDescriptor.addManyHeads(prefectureId, chunk.map(({ data }) => data), chunk.map(({ filename }) => filename)); // console.log("chunk:", prefectureId, chunk); + console.log(prefectureId,tx.hash); } console.log(`set Heads end`); diff --git a/contract/scripts/populate_localNouns_dummy.ts b/contract/scripts/populate_localNouns_dummy.ts new file mode 100644 index 00000000..d036a6bb --- /dev/null +++ b/contract/scripts/populate_localNouns_dummy.ts @@ -0,0 +1,125 @@ +import * as dotenv from "dotenv"; +import { ethers, network } from 'hardhat'; +import { addresses } from '../../src/utils/addresses'; + +const nounsDescriptor = addresses.nounsDescriptor[network.name]; + +import { images, palette, bgcolors } from "../test/image-local-data_test"; +import { abi as localSeederABI } from "../artifacts/contracts/localNouns/LocalNounsSeeder.sol/LocalNounsSeeder"; +import { abi as localNounsDescriptorABI } from "../artifacts/contracts/localNouns/LocalNounsDescriptor.sol/LocalNounsDescriptor"; +import { abi as localProviderABI } from "../artifacts/contracts/localNouns/LocalNounsProvider.sol/LocalNounsProvider"; +import { abi as localTokenABI } from "../artifacts/contracts/LocalNounsToken.sol/LocalNounsToken"; +import { abi as localMinterABI } from "../artifacts/contracts/localNouns/LocalNounsMinter.sol/LocalNounsMinter"; + +dotenv.config(); + + +const localSeederAddress = addresses.localSeeder[network.name]; +const localNounsDescriptorAddress = addresses.localNounsDescriptor[network.name]; +const localProviderAddress = addresses.localProvider[network.name]; +const localTokenAddress = addresses.localNounsToken[network.name]; +const localMinterAddress = addresses.localNounsMinter[network.name]; + +async function main() { + + // const privateKey = process.env.PRIVATE_KEY !== undefined ? process.env.PRIVATE_KEY : ''; + // const wallet = new ethers.Wallet(privateKey, ethers.provider); + const [wallet] = await ethers.getSigners(); // localhost + + // ethers.Contract オブジェクトのインスタンスを作成 + const localSeeder = new ethers.Contract(localSeederAddress, localSeederABI, wallet); + const localNounsDescriptor = new ethers.Contract(localNounsDescriptorAddress, localNounsDescriptorABI, wallet); + const localProvider = new ethers.Contract(localProviderAddress, localProviderABI, wallet); + const localToken = new ethers.Contract(localTokenAddress, localTokenABI, wallet); + const localMinter = new ethers.Contract(localMinterAddress, localMinterABI, wallet); + + if (true) { + // set Background + // console.log(`set backgrounds start`); + // await localNounsDescriptor.addManyBackgrounds(bgcolors); + // console.log(`set backgrounds end`); + + // set Palette + // console.log(`set Palette start`); + // await localNounsDescriptor.addManyColorsToPalette(0, palette); + // console.log(`set Palette end`); + + // set Accessories + // console.log(`set Accessories start`); + // const accessoryChunk = chunkArrayByPrefectureId(images.accessories); + // for (const chunk of accessoryChunk) { + // const prefectureId = chunk[0].prefectureId; + + // // if (Number(prefectureId) == 2) { + // await localNounsDescriptor.addManyAccessories(prefectureId, chunk.map(({ data }) => data), chunk.map(({ filename }) => filename)); + // console.log("chunk:", prefectureId, chunk); + // // } + // } + // console.log(`set Accessories end`); + + // set Heads + console.log(`set Heads start`); + const headChunk = chunkArrayByPrefectureId(images.heads); + for (const chunk of headChunk) { + const prefectureId = chunk[0].prefectureId; + + if (Number(prefectureId) > 30) { + await localNounsDescriptor.addManyHeads(prefectureId, chunk.map(({ data }) => data), chunk.map(({ filename }) => filename)); + console.log("chunk:", prefectureId, chunk); + } + } + console.log(`set Heads end`); + + } + +} + +main().catch(error => { + console.error(error); + process.exitCode = 1; +}); + +interface ImageData { + prefectureId: string; + filename: string; + data: string; +} + +function chunkArrayByPrefectureId(imagedata: ImageData[]): ImageData[][] { + let map = new Map(); + const head_dummy = '0x00041e1405040001a1014d011801a10118014d01a1014d01be01a101be014d01a1014d0700020001a10118024d0318034d03be034d01a1014d05000100024d034801a101be014801a10148014d0115014d01480118014803be0500010001a1014d014801a1014802be0348034d034801be01a101be0115014d030001000218014d0118014d011801150118014d01180148011801480118011501180348024d030001bc01150118034d0318024d0348031801480118014801be0115030012bc024d02be01480115010012bc0115014d0115014d0248010014bc024d030012bc014d011501bc01180115020012bc024d01bc0218020016bc030014bc014d011501000115014d0cbc014d011506bc024d0100024d0cbc024d03bc014d011503bc0300010010bc024d02bc0400020012010500'; + const accessory_dummy = '0x0017151e0e0200030d0200010005b40100014103b4010d01b40141014101b4030d01b40141014102b4020d01b40141014103b4010d01b40141010003b4010d01b401000200030d0200'; + for (let i = 0; i < imagedata.length; i++) { + // dataが空っぽはスキップ + if (imagedata[i].data === undefined) { + console.error("not define data:", imagedata[i].filename); + continue; + } + + let filename = imagedata[i].filename.split('-'); + let id = filename[0]; + imagedata[i].prefectureId = id; + if (false) { + if (filename[filename.length - 1] == 'heads') { + imagedata[i].data = head_dummy; + } else { + imagedata[i].data = accessory_dummy; + } + } + // filenameの抽出 ex)"35-yamaguchi-white -snake-accessories" -> "white-snake" + let name = ''; + for (var j = 2; j < filename.length - 1; j++) { + if (name.length > 0) { + name += '-'; + } + name += filename[j].trim(); + } + imagedata[i].filename = name; + // console.log("imagedata[i].filename", imagedata[i].filename); + if (!map.has(id)) { + map.set(id, []); + } + map.get(id)!.push(imagedata[i]); + } + return Array.from(map.values()); +} \ No newline at end of file diff --git a/contract/scripts/populate_localNouns_recover.ts b/contract/scripts/populate_localNouns_recover.ts new file mode 100644 index 00000000..51ef721e --- /dev/null +++ b/contract/scripts/populate_localNouns_recover.ts @@ -0,0 +1,119 @@ +import * as dotenv from "dotenv"; +import { ethers, network } from 'hardhat'; +import { addresses } from '../../src/utils/addresses'; + +const nounsDescriptor = addresses.nounsDescriptor[network.name]; + +import { images, palette, bgcolors } from "../test/image-local-data"; +import { abi as localSeederABI } from "../artifacts/contracts/localNouns/LocalNounsSeeder.sol/LocalNounsSeeder"; +import { abi as localNounsDescriptorABI } from "../artifacts/contracts/localNouns/LocalNounsDescriptor.sol/LocalNounsDescriptor"; +import { abi as localProviderABI } from "../artifacts/contracts/localNouns/LocalNounsProvider.sol/LocalNounsProvider"; +import { abi as localTokenABI } from "../artifacts/contracts/LocalNounsToken.sol/LocalNounsToken"; +import { abi as localMinterABI } from "../artifacts/contracts/localNouns/LocalNounsMinter.sol/LocalNounsMinter"; + +dotenv.config(); + + +const localSeederAddress = addresses.localSeeder[network.name]; +const localNounsDescriptorAddress = addresses.localNounsDescriptor[network.name]; +const localProviderAddress = addresses.localProvider[network.name]; +const localTokenAddress = addresses.localNounsToken[network.name]; +const localMinterAddress = addresses.localNounsMinter[network.name]; + +async function main() { + + // const privateKey = process.env.PRIVATE_KEY !== undefined ? process.env.PRIVATE_KEY : ''; + // const wallet = new ethers.Wallet(privateKey, ethers.provider); + const [wallet] = await ethers.getSigners(); // localhost + + // ethers.Contract オブジェクトのインスタンスを作成 + const localSeeder = new ethers.Contract(localSeederAddress, localSeederABI, wallet); + const localNounsDescriptor = new ethers.Contract(localNounsDescriptorAddress, localNounsDescriptorABI, wallet); + const localProvider = new ethers.Contract(localProviderAddress, localProviderABI, wallet); + const localToken = new ethers.Contract(localTokenAddress, localTokenABI, wallet); + const localMinter = new ethers.Contract(localMinterAddress, localMinterABI, wallet); + + + console.log(`localNounsDescriptor:`, localNounsDescriptor.address); + + if (true) { + + // console.log(`set backgrounds start`); + // await localNounsDescriptor.addManyBackgrounds(bgcolors); + // console.log(`set backgrounds end`); + + + // set Palette + // console.log(`set Palette start`); + // await localNounsDescriptor.addManyColorsToPalette(0, palette); + // console.log(`set Palette end`); + + // set Accessories + // console.log(`set Accessories start`); + // const accessoryChunk = chunkArrayByPrefectureId(images.accessories); + // for (const chunk of accessoryChunk) { + // const prefectureId = chunk[0].prefectureId; + // if (Number(prefectureId) == 3 || Number(prefectureId) == 2) { + // await localNounsDescriptor.addManyAccessories(prefectureId, chunk.map(({ data }) => data), chunk.map(({ filename }) => filename)); + // console.log("chunk:", prefectureId, chunk); + // } + // } + // console.log(`set Accessories end`); + + // set Heads + console.log(`set Heads start`); + const headChunk = chunkArrayByPrefectureId(images.heads); + for (const chunk of headChunk) { + const prefectureId = chunk[0].prefectureId; + if (Number(prefectureId) == 3) { + await localNounsDescriptor.addManyHeads(prefectureId, chunk.map(({ data }) => data), chunk.map(({ filename }) => filename)); + console.log("chunk:", prefectureId, chunk); + } + } + console.log(`set Heads end`); + + } +} + +main().catch(error => { + console.error(error); + process.exitCode = 1; +}); + +interface ImageData { + prefectureId: string; + filename: string; + data: string; +} + +function chunkArrayByPrefectureId(imagedata: ImageData[]): ImageData[][] { + let map = new Map(); + + for (let i = 0; i < imagedata.length; i++) { + // dataが空っぽはスキップ + if (imagedata[i].data === undefined) { + console.error("not define data:", imagedata[i].filename); + continue; + } + + let filename = imagedata[i].filename.split('-'); + let id = filename[0]; + imagedata[i].prefectureId = id; + + // filenameの抽出 ex)"35-yamaguchi-white -snake-accessories" -> "white-snake" + let name = ''; + for (var j = 2; j < filename.length - 1; j++) { + if (name.length > 0) { + name += '-'; + } + name += filename[j].trim(); + } + imagedata[i].filename = name; + // console.log("imagedata[i].filename", imagedata[i].filename); + if (!map.has(id)) { + map.set(id, []); + } + map.get(id)!.push(imagedata[i]); + } + return Array.from(map.values()); +} \ No newline at end of file diff --git a/contract/scripts/setup_localNouns.ts b/contract/scripts/setup_localNouns.ts new file mode 100644 index 00000000..62a90b2c --- /dev/null +++ b/contract/scripts/setup_localNouns.ts @@ -0,0 +1,129 @@ +// import * as dotenv from "dotenv"; +import { ethers, network } from 'hardhat'; +import { addresses } from '../../src/utils/addresses'; + +const nounsDescriptor = addresses.nounsDescriptor[network.name]; + +import { abi as localTokenABI } from "../artifacts/contracts/LocalNounsToken.sol/LocalNounsToken"; +import { abi as tokenGateABI } from "../artifacts/contracts/libs/AssetTokenGate.sol/AssetTokenGate"; + +const localTokenAddress = addresses.localNounsToken[network.name]; +const tokenGateAddress = addresses.tokenGate[network.name]; + +async function main() { + + let wallet; + if (network.name == 'localhost') { + [wallet] = await ethers.getSigners(); // localhost + } else { + const privateKey = process.env.PRIVATE_KEY !== undefined ? process.env.PRIVATE_KEY : ''; + wallet = new ethers.Wallet(privateKey, ethers.provider); + + } + + // ethers.Contract オブジェクトのインスタンスを作成 + const tokenGate = new ethers.Contract(tokenGateAddress, tokenGateABI, wallet); + const localToken = new ethers.Contract(localTokenAddress, localTokenABI, wallet); + + let tx; + // tokengateに設定 + if (network.name == 'mumbai') { + const nfts = [ + "0x9f3aBc7b9f17Fb58a367bdA86e6129a2F5849942" // TEST用 + ]; + tx = await tokenGate.functions['setWhitelist'](nfts); + } else { + const nfts = [ + "0x898a7dBFdDf13962dF089FBC8F069Fa7CE92cDBb", // NDJ-PFP + "0x866648Ef4Dd51e857cA05ea200eD5D5D0c6f93Ce", // NDJ-POAP + "0x09d53609a3709BBc1206B9Aa8C54DC71625e31aC", // Nounish CNP + "0x4bE962499cE295b1ed180F923bf9c73b6357DE80" // pNouns + ]; + tx = await tokenGate.functions['setWhitelist'](nfts); + } + console.log("tokengate設定", tx.hash); + + // ロイヤリティ設定 + const rolyaltyAddresses = [ + '0xA0B9D89F6d17658EAA71fC0b916fCCB248340382', // 運営 + '0xBE5f70E61D00acFb8Ba934551103387EE9fd3dB2' // eiba + ]; + const rolyaltyRatio = [ + 5, // 運営 + 5 // eiba + ]; + tx = await localToken.functions['setRoyaltyAddresses'](rolyaltyAddresses, rolyaltyRatio); + console.log("ロイヤリティ設定", tx.hash); + + // 運営用初期ミント + // 300体を都道府県割合で運用へミント + const mintNumForPrefecture = [ + [28, 9], + [1, 9], + [40, 9], + [22, 8], + [8, 8], + [34, 8], + [26, 8], + [4, 8], + [15, 8], + [37, 4], + [5, 4], + [30, 4], + [19, 4], + [41, 4], + [18, 4], + [36, 4], + [39, 4], + [32, 4], + [31, 4], + [20, 7], + [21, 7], + [10, 7], + [9, 6], + [33, 6], + [7, 6], + [24, 6], + [43, 6], + [46, 6], + [47, 6], + [25, 6], + [35, 6], + [29, 5], + [38, 5], + [42, 5], + [2, 5], + [3, 5], + [17, 5], + [44, 5], + [45, 5], + [6, 5], + [16, 5], + [13, 10], + [14, 10], + [27, 10], + [23, 10], + [11, 10], + [12, 10], + ]; + + for (var i = 0; i < mintNumForPrefecture.length; i++) { + try { + tx = await localToken.functions['ownerMint']([wallet.address], [mintNumForPrefecture[i][0]], [mintNumForPrefecture[i][1]]); + console.log("mint:", mintNumForPrefecture[i], tx.hash); + } catch (error) { + console.log("mint error:", mintNumForPrefecture[i], tx.hash); + // console.error(error); + }; + await sleep(1000); // 1秒待機 + } +} + +function sleep(ms: number): Promise { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +main().catch(error => { + console.error(error); + process.exitCode = 1; +}); diff --git a/contract/scripts/setup_localNouns2.ts b/contract/scripts/setup_localNouns2.ts new file mode 100644 index 00000000..a457c132 --- /dev/null +++ b/contract/scripts/setup_localNouns2.ts @@ -0,0 +1,48 @@ +// import * as dotenv from "dotenv"; +import { ethers, network } from 'hardhat'; +import { addresses } from '../../src/utils/addresses'; + +const nounsDescriptor = addresses.nounsDescriptor[network.name]; + +import { abi as localTokenABI } from "../artifacts/contracts/LocalNounsToken.sol/LocalNounsToken"; + +const localTokenAddress = addresses.localNounsToken[network.name]; + +async function main() { + + let wallet; + if (network.name == 'localhost') { + [wallet] = await ethers.getSigners(); // localhost + } else { + const privateKey = process.env.PRIVATE_KEY !== undefined ? process.env.PRIVATE_KEY : ''; + wallet = new ethers.Wallet(privateKey, ethers.provider); + + } + + // ethers.Contract オブジェクトのインスタンスを作成 + const localToken = new ethers.Contract(localTokenAddress, localTokenABI, wallet); + + let tx; + + // 都道府県ヘッドのミント + + for (var i = 101; i <= 147; i++) { + try { + tx = await localToken.functions['ownerMint']([wallet.address], [i], [3]); + console.log("mint:", i, tx.hash); + } catch (error) { + console.log("mint error:", i, tx.hash); + // console.error(error); + }; + await sleep(1000); // 1秒待機 + } +} + +function sleep(ms: number): Promise { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +main().catch(error => { + console.error(error); + process.exitCode = 1; +}); diff --git a/contract/scripts/setup_localNounsMinter.ts b/contract/scripts/setup_localNounsMinter.ts new file mode 100644 index 00000000..6becd784 --- /dev/null +++ b/contract/scripts/setup_localNounsMinter.ts @@ -0,0 +1,55 @@ +// import * as dotenv from "dotenv"; +import { ethers, network } from 'hardhat'; +import { addresses } from '../../src/utils/addresses'; + +const nounsDescriptor = addresses.nounsDescriptor[network.name]; + +import { abi as localTokenABI } from "../artifacts/contracts/LocalNounsToken.sol/LocalNounsToken"; +import { abi as localMinterABI } from "../artifacts/contracts/localNouns/LocalNounsMinter2.sol/LocalNounsMinter2"; + +const localTokenAddress = addresses.localNounsToken[network.name]; +const localMinterAddress = addresses.localNounsMinter[network.name]; + +async function main() { + + let wallet; + if (network.name == 'localhost') { + [wallet] = await ethers.getSigners(); // localhost + } else { + const privateKey = process.env.PRIVATE_KEY !== undefined ? process.env.PRIVATE_KEY : ''; + wallet = new ethers.Wallet(privateKey, ethers.provider); + + } + + // ethers.Contract オブジェクトのインスタンスを作成 + const localMinter = new ethers.Contract(localMinterAddress, localMinterABI, wallet); + const localToken = new ethers.Contract(localTokenAddress, localTokenABI, wallet); + + let tx; + + // ロイヤリティ設定 + const rolyaltyAddresses = [ + '0x4F4bD77781cEeE4914B6bC16633D5437eaBCa5D3', // fuyu256 + '0x7731396aEe82849D0824162e634422Ee7144507D', // miorobo + '0xBE5f70E61D00acFb8Ba934551103387EE9fd3dB2', // eiba + '0xA0B9D89F6d17658EAA71fC0b916fCCB248340382' // 運営 + ]; + const rolyaltyRatio = [ + 3764, // fuyu256 + 1236, // miorobo + 2500, // eiba + 2500 // 運営 + ]; + tx = await localMinter.functions['setRoyaltyAddresses'](rolyaltyAddresses, rolyaltyRatio); + console.log("ロイヤリティ設定", tx.hash); + + // Minter設定 + tx = await localToken.setMinter(localMinter.address); + console.log("Minter設定", tx.hash); + +} + +main().catch(error => { + console.error(error); + process.exitCode = 1; +}); diff --git a/contract/scripts/test_localNouns.ts b/contract/scripts/test_localNouns.ts index 1f264683..13ce7c76 100644 --- a/contract/scripts/test_localNouns.ts +++ b/contract/scripts/test_localNouns.ts @@ -21,9 +21,14 @@ const localMinterAddress = addresses.localNounsMinter[network.name]; async function main() { - // const privateKey = process.env.PRIVATE_KEY !== undefined ? process.env.PRIVATE_KEY : ''; - // const wallet = new ethers.Wallet(privateKey, ethers.provider); - const [wallet] = await ethers.getSigners(); // localhost + let wallet; + if(network.name == 'localhost'){ + [wallet] = await ethers.getSigners(); // localhost + }else{ + const privateKey = process.env.PRIVATE_KEY !== undefined ? process.env.PRIVATE_KEY : ''; + wallet = new ethers.Wallet(privateKey, ethers.provider); + + } // ethers.Contract オブジェクトのインスタンスを作成 const localSeeder = new ethers.Contract(localSeederAddress, localSeederABI, wallet); @@ -34,15 +39,18 @@ async function main() { console.log("localToken:", localTokenAddress); - for (var i: number = 101; i <= 147; i++) { - // for (var i: number = 1; i <= 47; i++) { + for (var i: number = 3; i <= 3; i++) { try { - await localMinter.functions['mintSelectedPrefecture(uint256)'](ethers.BigNumber.from(String(i)), { value: ethers.utils.parseEther('0.000001') }); + await localToken.functions['ownerMint']([wallet.address], [ethers.BigNumber.from( String(i))], [5]); + // await localToken.functions['ownerMint'](['0xECbCBAF0515757C48af10BEC8E70d6A4EbE479D6'], [ethers.BigNumber.from( String(i))], [10]); + + // const [svgPart] = await localProvider.generateSVGPart(i); + // console.log(svgPart); console.log(`mint [`, i, `]`); } catch (error) { console.log(`mint error [`, i, `]`); - // console.error(error); + // console.error(error); }; } @@ -61,41 +69,3 @@ main().catch(error => { console.error(error); process.exitCode = 1; }); - -interface ImageData { - prefectureId: string; - filename: string; - data: string; -} - -function chunkArrayByPrefectureId(imagedata: ImageData[]): ImageData[][] { - let map = new Map(); - - for (let i = 0; i < imagedata.length; i++) { - // dataが空っぽはスキップ - if (imagedata[i].data === undefined) { - console.error("not define data:", imagedata[i].filename); - continue; - } - - let filename = imagedata[i].filename.split('-'); - let id = filename[0]; - imagedata[i].prefectureId = id; - - // filenameの抽出 ex)"35-yamaguchi-white -snake-accessories" -> "white-snake" - let name = ''; - for (var j = 2; j < filename.length - 1; j++) { - if (name.length > 0) { - name += '-'; - } - name += filename[j].trim(); - } - imagedata[i].filename = name; - console.log("imagedata[i].filename", imagedata[i].filename); - if (!map.has(id)) { - map.set(id, []); - } - map.get(id)!.push(imagedata[i]); - } - return Array.from(map.values()); -} \ No newline at end of file diff --git a/contract/test/image-local-data.json b/contract/test/image-local-data.json index 36296273..15dfa89d 100644 --- a/contract/test/image-local-data.json +++ b/contract/test/image-local-data.json @@ -243,18 +243,7 @@ "395ed1", "ffc5f0", "cbc1bc", - "d4cfc0", - "fe6612", - "fe6412", - "fe6b14", - "fff5cb", - "544e4a", - "01499c", - "1f3445", - "282728", - "d3ad78", - "f9e1ba", - "d5d7e1" + "d4cfc0" ], "images": { "bodies": [ @@ -406,12 +395,16 @@ }, { "filename": "03-iwate-egg-accessories", - "data": "0x0018141b100100020101000101021e01010101021e0101010002010100" + "data": "0x0018131b0f0100020101000101021e01010101021e0101010002010100" }, { "filename": "03-iwate-fujiwara-accessories", "data": "0x0017141c0f0100012303000200012302000200015d02000100026701cd0100046701310101013101670201" }, + { + "filename": "03-iwate-zashikiwarashi-accessories", + "data": "0x0018131c0f022301440100012301880123010004be01be027901be03be0100" + }, { "filename": "04-miyagi-beeftongue-accessories", "data": "0x0019131a0e013501a1013501a10135018501a1018501a10135" @@ -442,7 +435,7 @@ }, { "filename": "06-yamagata-lafrance-accessories", - "data": "0x0019131c10010001840100010001840122022201c601de0222" + "data": "0x0019121c0f010001840100010001840122022201c601de0222" }, { "filename": "06-yamagata-shogi-accessories", @@ -478,7 +471,7 @@ }, { "filename": "09-tochigi-lemon-accessories", - "data": "0x0018131c100152020103c701c7015201c7010101c701010352" + "data": "0x0018121c0f0152020103c701c7015201c7010101c701010352" }, { "filename": "09-tochigi-shimotsukare-accessories", @@ -496,13 +489,21 @@ "filename": "10-gunma-yakimanjyu-accessories", "data": "0x0017161e0e04000236011101220300023401230101010003000136011101340136010002000134011101230101020001000134013601340101013602000100011101340123013403000100012201360134040001220700" }, + { + "filename": "11-saitama-dischargechannel-accessories", + "data": "0x0017171c0c03a0010003a0010003a0010001a001cf020001a0020001cf01a00100010001a001cf020001a0020001cf01a00100010001a001e0020001a0020001e001a00100010001a0030001a0030001a00100010001e0030001e0030001e00100" + }, { "filename": "11-saitama-icicle-accessories", "data": "0x0015171c090e0104000101010001010100010101000101010001010100040001e0010001010100010101000101010001010100060001010100010101000101010001e0010006000101010001e001000101030006000101030001e00300060001e0030001e00300060001e00700" }, + { + "filename": "11-saitama-satsumaimo-accessories", + "data": "0x0019151b0e0100020901280300030901280200010901000309010001090100" + }, { "filename": "11-saitama-soka-senbei-accessories", - "data": "0x0018131b0f0100016001e6010002e601110160011103e60100011101e60100" + "data": "0x0018121b0e0100016001e6010002e601110160011103e60100011101e60100" }, { "filename": "12-chiba-inubosaki-accessories", @@ -514,7 +515,11 @@ }, { "filename": "12-chiba-peanuts-accessories", - "data": "0x0018131b100100016001d8010002600260010001d801600100" + "data": "0x0018121b0f0100016001d8010002600260010001d801600100" + }, + { + "filename": "13-tokyo-scramblecrossing-accessories", + "data": "0x0016161f0c030001010100010101000101010001010201010001010100010101000101010001010a000201060001010100060001010100010101000201020001010100010103000400010105000201080003000101010001010100010101000101020101000101010001010100010101000101" }, { "filename": "13-tokyo-tower-accessories", @@ -522,24 +527,32 @@ }, { "filename": "13-tokyo-yamanote-accessories", - "data": "0x0018141c0f010001c0010101c00100010103bc010101c003bc01c00101010001bc01000101010001c0010101c00100" + "data": "0x0018131c0e010001c0010101c00100010103bc010101c003bc01c00101010001bc01000101010001c0010101c00100" }, { - "filename": "14-ibaraki-natto-accessories", - "data": "0x001814190e012b0100012b0100012b01000100012b0100012b0100012b" + "filename": "14-kanagawa-akarenga-accessories", + "data": "0x0017171b09010001c8050001c8050001c80161017f056101a10561017f0161017f0461014701a101470461017f01bc01a1010001a101bc01a101bc01a101bc01a101bc014701bc01a1014701a1010001a1014701a1014701a1014701a1034701a1" }, { "filename": "14-kanagawa-baybridge-accessories", "data": "0x0018171e09030001010100015805000101010001580300010101a2015801c8030001a2010101a20158010001a201000101010001a2010001c8010001a201000101010001a201a20200010101a2015801a2010001a2010001a2010101a20158020101000b010300010101000158050001010100015803000101010001580500010101000158" }, + { + "filename": "14-kanagawa-escalator-accessories", + "data": "0x0017151d0e02000128010c03000200010c02000128010c0128010c0300010c0100010c02000128010c02000300010c030001000128010c04000100010c0500" + }, { "filename": "14-kanagawa-yacht-accessories", - "data": "0x0018141c100100015402000254014301000254024302000243037f0100" + "data": "0x0018121c0e0100015402000254014301000254024302000243037f0100" }, { - "filename": "15-nigata-edamame-accessories", + "filename": "15-niigata-edamame-accessories", "data": "0x0019141b0e0200014e0200014e0100014e01c00100014e01c0011e01c00100011e01c00100" }, + { + "filename": "15-niigata-poppoyaki-accessories", + "data": "0x0015171c09022802410228024102280241022802280241022802410228024102280e000e0004000135010001350100013501000135010001350100040001350100013501000135010001350100013501000400013501000135010001350100013501000135010004000135010001350100013501000135010001350100" + }, { "filename": "15-niigata-riceear-accessories", "data": "0x0018131d0f02000128010001000128020001c001280100012801c001000128010002c0020002c00200" @@ -588,6 +601,14 @@ "filename": "19-yamanashi-grape-accessories", "data": "0x0018121b0e0200019a01220100019a0112019a019a0112016e01120112016e01450100" }, + { + "filename": "19-yamanashi-momo-accessories", + "data": "0x0018121a0f0100024c0220010002eb0100" + }, + { + "filename": "20-nagano-gyunyupan-accessories", + "data": "0x0017171b09028e0100038e0100038e0100038e0288018e0388018e0388018e0388020101000b01028801000b88028e01000b8e" + }, { "filename": "20-nagano-kappa-accessories", "data": "0x0018131a0e020f0201010f0100013e0123013e01000100023e022a" @@ -612,10 +633,22 @@ "filename": "21-gifu-ukaibody-accessories", "data": "0x0015171f090592075402920592075402920592075402920592075402920292010002920754029202920100029207540292029201000bad0292010001ad012601ad012601ad012601ad012601ad012601ad02920100012601ad012601ad012601ad012601ad012601ad012602920100012601ad012601ad012601ad012601ad012601ad012602920100012601ad012601ad012601ad012601ad012601ad0126" }, + { + "filename": "22-shizuoka-chabatake-accessories", + "data": "0x0017171e0c08000379080003e104000779040007e10879030008e103000479070004e10700" + }, { "filename": "22-shizuoka-fuji-accessories", "data": "0x0017171d0c090002e0020003e0020001010300060002320101020003e0020005320100040001e10632020001dd04e1043204dd07e1" }, + { + "filename": "22-shizuoka-sakuraebi-accessories", + "data": "0x0018121b0e0300010e0238010e013801380300010001380200" + }, + { + "filename": "23-aichi-misodengaku-accessories", + "data": "0x0019141c0e03350157020001570235015702600335016302000163023501630260" + }, { "filename": "23-aichi-oguratoast-accessories", "data": "0x0018131c0e0293028401930193028401b80193019301b8028401930193018401b8018401930593" @@ -624,6 +657,10 @@ "filename": "23-aichi-tebasaki-accessories", "data": "0x0017131a0e010001480300014804000548010003480100" }, + { + "filename": "23-aichi-uiro-accessories", + "data": "0x0019151a0e0186010001790100016a010001c10186010001790100016a010001c1" + }, { "filename": "24-mie-iseebi-accessories", "data": "0x0017151e0d02000132020001320200010001320100023201000132010001000132010002320100013201000132021802320218013201320100011802b40118010001320100011801000232010001180100030002b40300020001180132011801320200" @@ -632,6 +669,14 @@ "filename": "24-mie-mochi-accessories", "data": "0x0019121a0f018401b80184018401b80184" }, + { + "filename": "24-mie-pearl-accessories", + "data": "0x001514170d01010500010101000101030001010100020003010200" + }, + { + "filename": "25-shiga-akakonnyaku-accessories", + "data": "0x0018141a0e032c0200012c022c0200022c012c0200032c" + }, { "filename": "25-shiga-funazushi-accessories", "data": "0x0018151a0e01420100013701000137020001420100014201000137010001370142010001420100014201000142" @@ -644,6 +689,10 @@ "filename": "26-kyoto-daimonji-accessories", "data": "0x0017161d0d0300011405000200011401490114040003140149031402000749020002000114014901140400021401490100014904140249030003490100" }, + { + "filename": "26-kyoto-torii-accessories", + "data": "0x0016171e0d0300070e04000141010001410100014101000200070c014103000124014101240100012401410100070e022401000100014101000141010001410100012402000741010c0200010001410300014104000100010e0300010e0400" + }, { "filename": "26-kyoto-yatsuhashi-accessories", "data": "0x0018131a0e02000157020001000157018601570100015702860257" @@ -656,9 +705,25 @@ "filename": "27-osaka-jinbezame-accessories", "data": "0x0018161c0d010001a2020001a20400010601a2010002a20400020001a2010602a20106020002a2012302a20106012302a202000206025f01060200" }, + { + "filename": "27-osaka-kushikatsu-accessories", + "data": "0x0018141d0e02b801e6030002b801e6036001b803e6020003b801e6026002b801e6030003b80360" + }, + { + "filename": "27-osaka-owarai-accessories", + "data": "0x0017141c0e0100013301000133020001000533013301000133010001330100010005330300013302000100023301000233" + }, + { + "filename": "28-hyogo-akashikaikyobridge-accessories", + "data": "0x0018171d0903000101070001010200020003010500030101000100010101000101010001010300010101000101010001010101020001010200030102000101020001a001400100010101a0014001a0014001a001a601a0010101a001a603000101070001010200" + }, { "filename": "28-hyogo-akashiyaki-accessories", - "data": "0x0019141b0f02000260010001000160015d016001ae015d016002ae0160" + "data": "0x0019131b0e02000260010001000160015d016001ae015d016002ae0160" + }, + { + "filename": "28-hyogo-jst-meridian-accessories", + "data": "0x0017161c0d0132080001320800013202000132050002000232010002320100013201000232020001320300040002320300" }, { "filename": "28-hyogo-tower-museum-accessories", @@ -666,12 +731,20 @@ }, { "filename": "29-nara-kakinohasushi-accessories", - "data": "0x0019141c0f010001c0011b01c0011b0100011b02c0011b019501a2019501a2010002cc019701cc0100" + "data": "0x0019131c0e010001c0011b01c0011b0100011b02c0011b019501a2019501a2010002cc019701cc0100" }, { "filename": "29-nara-narazuke-accessories", "data": "0x0019121a0f03b801b8010001b8" }, + { + "filename": "29-nara-yoshinoyama-accessories", + "data": "0x0017151b0d02e1011b02ba01ed011b01e101ed025f02e101ed025f01ba01ed015f02ba01e1011b015f015f02ba02e1011b02ba015f02e1011b02ed01ba015f" + }, + { + "filename": "30-wakayama-meharizushi-accessories", + "data": "0x0018141c0e010004e1010002e1030101e102c00101021b010102e1030101e1010002e101c001e10100" + }, { "filename": "30-wakayama-mikan-kaki-accessories", "data": "0x0018121a0f03c201c201e101c203c2" @@ -681,12 +754,28 @@ "data": "0x001a151b0d024e010002a60100029c024e010002a60100029c" }, { - "filename": "33-oakayama-mamakari-accessories", - "data": "0x0019151b0e01a2019d01a2019d01a201000157019d01a2019d01a2019d01060100050601000157" + "filename": "31-tottori-dunes-accessories", + "data": "0x0019171f0901bd01d8015803d808bd02c9015803c902d806bd02d8015803d802c903d803bd02c9015803c902d803c903d802d8015803d802c903d803c902c9015803c902d803c903d802d8015803d802c903d803c9" }, { - "filename": "33-okauama-muscat-accessories", - "data": "0x0018141c0f0200014e010001ac0100014e01c0014e0100014e01c0014e01c0014e01c0014e01c0014e0100010001c0014e0200" + "filename": "31-tottori-mosa-shrimp-accessories", + "data": "0x0017161e0b01140100011408000100011601140123011601000114040002000116015101af011401af011401af020003000251011601510116015101140100020002160151011601510200011401af0100011602000116050001510100011601000116030002140151011403000116050001140100" + }, + { + "filename": "31-tottori-sand-borer-accessories", + "data": "0x0015141f0e020001a30300020001c30300020001c30300010001c101c301e90200010002c101e90200010002c102e9010003c102e9010003c10101012301e903c1020101e903c103e903c103e9" + }, + { + "filename": "32-shimane-rope-accessories", + "data": "0x0018171e0b0c7703d8017204d8017203d803000172040001720300010001780100017202780100017801720100017801b1010001b1027801b1027801b1027801b101780100017801b1027801b1027801b102780100020002d8010102d8010102d80200" + }, + { + "filename": "32-shimane-shijimi-clam-accessories", + "data": "0x0018131b0f010003920100036f019d0193019d010003920100" + }, + { + "filename": "32-shimane-tamahagane-accessories", + "data": "0x0018131b0e020001e001060100010001e0010601c8016201e00106016f0262016f03620100" }, { "filename": "33-okayama-denim-jacket01-accessories", @@ -704,10 +793,18 @@ "filename": "33-okayama-kibidango-accessories", "data": "0x0018131b0f010002570100015703eb04eb010002eb0100" }, + { + "filename": "33-okayama-mamakari-accessories", + "data": "0x0019151b0e01a2019d01a2019d01a201000157019d01a2019d01a2019d01060100050601000157" + }, { "filename": "33-okayama-momotaro-accessories", "data": "0x0015171f080100054d010105040101024d0100054d010105040101024d01000204034d010105040101024d01000204034d010105040101024d010002040100024d010105040101024d010002040100024d010105040101024d01000204010001eb014d010105740101024d01eb020401eb010a01eb010105740101024d01eb020402eb014d010105540101024d01eb020402eb014d010105540101024d01eb020402eb014d010105540101024d" }, + { + "filename": "33-okayama-muscat-accessories", + "data": "0x0018141c0f0200014e010001ac0100014e01c0014e0100014e01c0014e01c0014e01c0014e01c0014e0100010001c0014e0200" + }, { "filename": "33-okayama-peach02-accessories", "data": "0x0018151c0e0300015f03000200035f02000100055f0100011d025f01e5025f011d0100011d015f01e5015f011d0100" @@ -749,12 +846,12 @@ "data": "0x0017171f090e53055303ad03880253010f01e101bf0100025302ad028801bf0288020f02e1010003530288011b01bf011b030f02e1010001bf0253021b020f01bf030f02e1010001e101bf021b040f01bf021b02e1010002e101bf040f01bf031b02e1010003e104bf041b02e1010006e1051b" }, { - "filename": "35-yamaguchi-white -snake-accessories", - "data": "0x0017151e0e060001bf0400020101000200010101af02010100010001010500010001af030102000500010101000201030001af0100020001af02010200" + "filename": "35-yamaguchi-tsunoshima-big-bridge-accessories", + "data": "0x0015171f090e3c0e3c041b02e101e0071b035603e1015601e0065602560100045601e0065602560100045601e0065602560100045601e0065601e101560100045601e0065602e10100045601e0065602e1010001e1035601e0065602e1010003e103c8051b" }, { - "filename": "35-yamaguhchi-tsunoshima-big-bridge-accessories", - "data": "0x0015171f090e3c0e3c041b02e101e0071b035603e1015601e0065602560100045601e0065602560100045601e0065602560100045601e0065601e101560100045601e0065602e10100045601e0065602e1010001e1035601e0065602e1010003e103c8051b" + "filename": "35-yamaguchi-white-snake-accessories", + "data": "0x0017151e0e060001bf0400020101000200010101af02010100010001010500010001af030102000500010101000201030001af0100020001af02010200" }, { "filename": "36-tokushima-awaodori-accessories", @@ -772,6 +869,14 @@ "filename": "37-kagawa-oliveoil-accessories", "data": "0x0017121c0f010001ac01000100015c0100035c015c01c6015c015c01c6015c035c" }, + { + "filename": "37-kagawa-stairs-accessories", + "data": "0x0015171f0c0a000174090002d7080003740100090501d702000105020001050274010502740100090501d70200010501000474010502740200010505d7010502d702000105057401050274010001d7010505d7010502d70b74" + }, + { + "filename": "37-kagawa-udon-accessories", + "data": "0x0018171e0e01d801e9010b01e905d8010001e9010b01e90500010001e9010b01e905000701020007540200010005010300020003a00400" + }, { "filename": "38-ehime-dango-accessories", "data": "0x0018131c0e0300021b020002a6011b0100027001a60100010001570170020001570400" @@ -788,18 +893,34 @@ "filename": "38-ehime-turt-accessories", "data": "0x0018141c0e0100045701000157037002570157017001570270015701570270015701700157010004570100" }, + { + "filename": "39-kochi-beach-accessories", + "data": "0x0016171f090b00034c0700064c01dd050402c904dd014c02dd010401c90100010404c903020360025601000756010101c90102016002560100085602c90102025601000756020101020160025601000456030102020260025601000401030204600202010004020760" + }, + { + "filename": "39-kochi-ginger-accessories", + "data": "0x0018141c0f020001ad01d8010001d8010001d802e7010001ad01d801e701a601d801ad01d8020001d80400" + }, { "filename": "39-kochi-seared-bonito-accessories", - "data": "0x0019131b0f0378010001780294017801780394" + "data": "0x0018141b0e010003ab020001ab033901ab010001390389013901ab013904890139" }, { "filename": "40-fukuoka-mentaiko-accessories", "data": "0x0019171b0902bf0100016a02bf0100026a01bf0100016a01bf016a026a0100036a0100016a01bf016a0100036a02bf0100026a01bf0100036a0100026a01bf" }, + { + "filename": "40-fukuoka-strawberry-accessories", + "data": "0x0018131b0f0200010f01000100020f0171020f027101000371" + }, { "filename": "40-fukuoka-umegaeda-accessories", "data": "0x0018131c0e010003c1010002c1019702c101c1019701c1019701c101c1029702c1010003c10100" }, + { + "filename": "41-saga-aritayaki-accessories", + "data": "0x0019131b0e010001e0035401e00100011802e0010001e00318" + }, { "filename": "41-saga-saga-accessories", "data": "0x0017151d0e010002560200015601000100015602000156010001560256020001560100015607000156040001560100015601000156010001560100015603560100015601000156" @@ -820,6 +941,10 @@ "filename": "42-nagasaki-milkshake-accessories", "data": "0x0018121d0f014d02000157017101570357037f0100017f0100037f" }, + { + "filename": "43-kumamoto-basashi-accessories", + "data": "0x0017151d0d0600022c0300022c0100022c022c0100022c0100022c022c0100022c0300022c0400010f010003000129040001570700" + }, { "filename": "43-kumamoto-hitomojiguruguru-accessories", "data": "0x001913190e014e01e101c001e1014e" @@ -828,6 +953,10 @@ "filename": "43-kumamoto-ikinaridango-accessories", "data": "0x0018131b0e01000351010001d401b8028401d401d40129012a012901d4010003d40100" }, + { + "filename": "44-oita-hoshishiitake-accessories", + "data": "0x0017171e09037e0100037e0100037e0100027e010001af030001af030001af030001af0e00017e0200027e0100037e0100037e0100030001af030001af030001af02000e00027e0200037e0100037e0100027e010001af030001af030001af030001af" + }, { "filename": "44-oita-toriten-accessories", "data": "0x0019121b0f01000293039301930200" @@ -840,6 +969,10 @@ "filename": "45-miyazaki-mango-accessories", "data": "0x0018131a0e0100014601e601460100014601e6014601e601460100014601e601460100" }, + { + "filename": "45-miyazaki-moai-accessories", + "data": "0x0018141d0e05740100020c0174020c01050205017403050105037402050105030c0105010005050100" + }, { "filename": "45-miyazaki-takachihokyo-accessories", "data": "0x0017141c0d020601e1013d03e10127010501060105013d02e10127010501270106013d02e10127010501270106010101050127012701050201013d010501270127053d0127" @@ -852,6 +985,10 @@ "filename": "46-kagoshima-shochu-accessories", "data": "0x0017121c0f0100012301000100013401000334017f01b7017f01b7027f0334" }, + { + "filename": "46-kagoshima-yakusugi-accessories", + "data": "0x0015151d0d0100027c01a4017c01a4010001a4010001a4017c01a4017c01a4010001a4010001a4017c01a4017c01a40100017c010001a4017c01a4027c01a40100010001a4017c02a4017c02000100017c01a4017c02a402000100017c01a4017c02a40200010001a4017c01a4017c01a40200017c0100017c010001a4010001a40100" + }, { "filename": "47-okinawa-fish-accessories", "data": "0x0017171d0d012401000224060001000224010001240500012401000224010001280100022801000600022801000128019b0100029b010001280100022801000100029b0100019b0500019b0100029b0600" @@ -872,7 +1009,11 @@ }, { "filename": "01-hokkaido-ishikari-heads", - "data": "0x00031c15040400067f0200017f0b000200037f0400017f0300027f0100017f07000100017f0200037f0200010d037f02e1010003a201e004000200027f0100017f020d06e103a203e004000400020d015702e101a2019501a201e103a2010d02e0019504000300020d015702a2019501ce029704a204e0010d03000200020d019501a201ce029703ce03a205e0020d02000100020d015704ce01cd02ce01cd02a206e00157020d01000100010d0101019501a207ce060101e0014e0257010d0100010e010d010109ce0757034e010d010e010e010d01220957015d0657034e010d010e010e010d03010e570149024e010d010e0100010d0301015701f30c570249014e010d01000100010d01220101015701490d570149014e020d01000200020d034901570434025705010157020d02000300020d01490157023401af033405010157020d03000400030d033402af01340501020d04000600020d05340257030d060009000334030d0900" + "data": "0x00031c15040400067f0200017f0b000200037f0400017f0300027f0100017f07000100017f0200037f0200010d037f02e1010003a201e004000200027f0100017f020d06e103a203e004000400020d015702e101a2019501a201e103a2010d02e0019504000300020d015702a2019501ce029704a204e0010d03000200020d019501a201ce029703ce03a205e0020d02000100020d015704ce01cd02ce01cd02a206e00157020d01000100010d0101019501a207ce060101e0014e0257010d0100010e010d010109ce0757034e010d010e010e010d01221057034e010d010e010e010d03010e570149024e010d010e0100010d03010e570249014e010d01000100010d01220101015701490d570149014e020d01000200020d034901570434025705010157020d02000300020d01490157023401af033405010157020d03000400030d033402af01340501020d04000600020d05340257030d060009000334030d0900" + }, + { + "filename": "01-hokkaido-potato-heads", + "data": "0x00061a1406060007eb070004000ceb0400020010eb0200010004eb01ea06eb01ea06eb0100010005eb01ea06eb01ea05eb010014eb14eb14eb14eb14eb13eb0100010002eb01ea0beb01ea03eb0100010003eb01ea03eb01ea01eb01ea05eb01ea02eb0100020007eb01ea08eb020003000eeb0300" }, { "filename": "01-hokkaido-tokeidai-heads", @@ -890,6 +1031,10 @@ "filename": "02-aomori-goldfish-nebuta-heads", "data": "0x000119170409000333090008000533080007000233010101330101023307000700033301010333070005000b3305000400053301010133010105330400030002330101043301010433010102330300030003330101033303bf01330101033303000300053307bf033303000100053303bf010103bf010103bf0333010005330dbf03330233010101330fbf0233033301010fbf023301000233022301010bbf0101022301000200013302230dbf02230100040001230dbf01230200040001bf012304bf032304bf012301bf020005000123030101bf010d01b4010d01bf03010123030006000301010d0301010d030104000200010101000201010001330301012303010133010002010100010103000101010001010100013302000123010101230200013301000101010001010100030002010d0002010100050001010b0001010300" }, + { + "filename": "03-iwate-konjikido-heads", + "data": "0x00041d14040c0001da0c000b0003e40b000a00018601970186019701860a0008000186019701860197018601970186019701860800060001860197018601970186019701860197018601970186019701860600018601000186019701860197018601970186019701860197018601970186019701860197018601970186019701860100018601000197018601970186019701860197018601970186019701860197018601970186019701860197018601970186019701000100016d01e4016d01e4016d01e4016d01e4016d01e4016d01e4016d01e4016d01e4016d01e4016d01e4016d01e4016d01000300016d0129046d0129056d0129046d0129016d0300010001da020011e4020001da010004000129016d02ad016d0129016d03ad016d0129016d02ad016d0129040004000129016d02ad016d0129016d01ad01e401ad016d0129016d02ad016d0129040004000129016d01ad01e4016d0129016d03e4016d0129016d01e401ad016d0129040004000129016d01ad01e4016d0129016d03e4016d0129016d01e401ad016d01290400196d012901e4022901e4042901e4052901e4042901e4022901e40129010001e4020001e4040001e4050001e4040001e4020001e40100" + }, { "filename": "03-iwate-moriokamen-heads", "data": "0x00031d15040b00012303bf0a000900012302bf020103bf08000900012301bf010105bf08000800012303bf03a003bf07000800012302bf04a003bf07000800012302bf05a002bf07000900012302bf02a003bf0800040001060401010006bf010004330400020001060201034701930201010003bf02330401023302000100010601010193054702930101020001330401015703010133010001000106010101930347012901930129019301010200013302010257012201dd015701010133010001060101043704290293010101330201015701dd012201b80122015702010133010601010337062901220101013301010257012201b8018501b80257010101330106010102370101011e04290222010101330101025701b8018501b80185012201570101013301060101013701930201042902220101013301010257012201b80185012201dd0157010101330100010601010193052902930101020001330201015701dd0122025701010133010001000106010102930397019303dd0200013303010257030101330100020001060201019302970193020104000233040102330200030002060401080004330400" @@ -932,7 +1077,7 @@ }, { "filename": "06-yamagata-zaookama-heads", - "data": "0x00041d14040a00072702010227040007000b2703010127030005000e27024c0101012702000400022701010c2704010127010003000127020103270a010127024c0101012701000200020102270301073004010127030101270100010102270201019b0b3002010127024c01010127022703010e30020101270101022702010235103001010127010102270235123001010127010102270201019b113001010127010102270101014c010111300301012701000101014c02010f3003010127020001000201014c01010e3003010127020002000101014c03010a300201014c01010127030003000201014c0b01014c0101014c0101040005000401014c0101014c0101014c0301014c01010600" + "data": "0x00061a1405030003e10900037e01880200020004bb02e104000151037e02d1017e01880100010002bb04e103bb0251057e01d1017e01880100030006bb0151037e0251017e0151017e02d10100010003bb02e101bb0251027e0751037e020003bb0251027e073f0351027e010005bb027e0a3f035105bb017e0d3f01510188020002bb01880e3f01510188020001bb01880e3f0388010004bb0d3f0188027e020005bb023f0251063f015101880200030003bb01e101bb0a51017e0200020006e101bb02e1015101e1015101e10251027e020004000ce10151017e0300" }, { "filename": "07-fukushima-peach-heads", @@ -982,6 +1127,10 @@ "filename": "10-gunma-takasakidaruma-heads", "data": "0x00061a1607050009410500030002410101014102010741030002000f41020001000141016001410123020102230101022302010123014101e601410100010001e6022301010423010104230101022301e60100014101e60123020103a70101010e010103a7020101230141016001e60160020101a7030101a7010101a7030101a7020101e6016001e60160020101a7030101a7010101a7030101a7020101e6014101e60141020101a7030101a7010101a7030101a7020101e60160014101600223010103a7030103a701010223014101e602410123030101a1010101a1010101a1010101a1030101230241010001410123010e040102410501010e012301410100010002410223010e0123014102010141010e0123010e02230241010002000341010e0123010e0301010e0123010e034102000300014101600141016001410260024101600141016001410300040001e6014101e6024101e6024101e6014101e60400060001e6014101e6014101e6014101e60600" }, + { + "filename": "11-saitama-musashinoudon-heads", + "data": "0x00051c15050e00040305000c00080303000b00030304a0030302000a00030307c1020301000a00010309a001c1010301000900030309c102030900020301c109a00203030004480200020301a006c102a00303010008480100010307a003c1010301b1034801b8029301b80348020308c1020301b1014801b802830222028301b8014801b1030305a0020301b10100014801830222018302220283014802b1080302b10100014801b8019302e90183029301b80148020002b1040302b1030001bc024801b8022201b8024801bc02a2010006b1040003bc044803bc0d00010008bc0e00030004bc1000" + }, { "filename": "11-saitama-tokinokane-heads", "data": "0x000315140a050002ab0400030006ab020001000aab020001d701b801000292010001b80200010001d7010001b801000292010001b80200038601b801000292010001b80200030001b8040001b80200030001b8048501b80200030001b8048501b80200020008ab010001000aab030001b8048501b80200030001b8048501b80200030001b8048501b80200020001b8068501b80100020001b801b601a401b601a401b6018501b80100020001b8068501b80100020001b8068501b80100" @@ -998,10 +1147,18 @@ "filename": "12-chiba-nanohana-heads", "data": "0x00051d14030700012a0300012a0200012a0200012a0100012a0300012a02000300012a0100012a0100022a0100022a0100012a0100022a0100022a06000200012a0100122a0100012a02000200172a01000100062a0122112a01000100152a0122022a01000100032a0122152a1a2a042a01c0102a01c0042a032a02c0012a01c00d2a02c0012a01c0022a0100012a01c0012a02c00d2a01c0012a02c0032a0100012a01c0012a01c0012a01c00c2a01c0012a01c0012a01c0012a0100012a0100012a03c00e2a03c0022a0100022a01c0012a01c0012a01c0042a0122072a01c0012a01c0012a01c0012a0100012a0100012a03c0062a0322052a03c0012a02000100012a020001c0102a01c0012a0100012a0100" }, + { + "filename": "12-chiba-pear-heads", + "data": "0x0006191508040009e70400020004e70222017e022204e70200010006e70122017e012206e7010001000fe7010011e711e711e711e711e711e711e701000fe70100010005e7017e03e7017e05e70100020005e7037e05e7020003000be70300050007e70500" + }, { "filename": "12-chiba-soysauce-heads", "data": "0x000317140b010008b40300020006b4020001850100020006b404000200066f030001850200016f0101046f04000200016f0101046f04000100016f01b8010104b8016f03000100016f010105b8016f0300026f06b8026f0200026f06b8026f0200016f08b8016f0200016f08b8016f0200016f08b8016f0200016f08b8016f0200016f08b8016f0200016f02b803ea03b8016f0200016f08b8016f02000a6f0200" }, + { + "filename": "13-tokyo-oochouchin-heads", + "data": "0x0003181408050004ad01da01ad050003000a6403000100034108230341010003640a230364024101230241012301410223024101230141012302410264012301640123026402230164012302640123026403410a2303410364012302640323026402230364034102230241032302410123034104640823046403410a2303410364012302640323026402230364034102230241032302410123034103640a23036403410123084101230341010002640123076402230264010003000a410300050004ad01da01ad0500" + }, { "filename": "13-tokyo-station-heads", "data": "0x00011c14050b0001360b0017000b0001360b000b0001360b000700030d0336030d07000600010d010b010d0136010d010b010d0136010d010b010d06000600030d0136030d0136030d06000100013604000bbf040001360100060001bf020b01bf030b01bf020b01bf0600010001360300040d0136030d0136040d03000136010003360100010d010b020d0136010d01bf010b01bf010d0136020d010b010d0100033603bf030d01350136020d03bf020d01360135030d03bf010b02bf010b01bf010b010101bf010b01bf030b01bf010b01bf0101010b01bf010b02bf010b010b02bf010b01bf010b010101bf010b01bf030b01bf010b01bf0101010b01bf010b02bf010b06bf010109bf010106bf010b02bf010b01bf010b02bf010b01bf030b01bf010b02bf010b01bf010b02bf010b010b02bf010b01bf010b02bf010b01bf030b01bf010b02bf010b01bf010b02bf010b170d010b02bf0272010b04bf037201bf010b02bf010b027202bf010b010b02bf0272010b04bf037201bf010b02bf010b027202bf010b" @@ -1011,8 +1168,8 @@ "data": "0x0001181408030001e0010001e0010001a201e0010001e0010001e00300030003e0010001a201e0010003e00300030003e0010001a201e0010003e00300030001e0010001e0010002e0010001e0010001e00300020001e0020002e001a203e0020001e00200020001e0010002e0010001a201e0010002e0010001e00200020001e0010002e0010001a201e0010002e0010001e00200020001e0010001e0020001a201e0020001e0010001e00200020001e0010001e0020002e0020001e0010001e00200020003e0010001e001a202e0010003e00200020001e0010002e0010001a201e0010002e0010001e00200010001e0020002e0010001a201e0010002e0020001e00100010001e0010002e0020001a201e0020002e0010001e00100010001e0010002e0020002e0030001e0010001e00100010001e0010001e0020001e002a201e0020001e0010001e00100010003e0020001e002a201e0020003e0010001e0020001e0010001e0010002a2010001e0010001e0020001e001e0010001e0020001e0010002a2010001e0020001e0010001e001e0010001e0010001e0020002a2020001e0010001e0010001e005e0020002a2020005e0" }, { - "filename": "14-ibaraki-anglerfish-heads", - "data": "0x00031e14010700059811000400027e0a980d000300047e0b980b000200047e03000a980a000200037e06000a9808000300017e06000c98070008000f9806000600129805000500149804000400159804000100037e1598037e0100047e1598047e047e1598047e0100027e010015980100027e0100050005980a3905980400050003980e39029805000600019810390198050008000e980700" + "filename": "13-tokyo-tower0-heads", + "data": "0x000117140a0600014106000600010106000600010106000600014106000600014106000600010106000500035405000500030105000500014101be01410500040001010100010101000101040004000501040004000141010001be0100014104000400024101be024104000300010101540101015401010154010103000400050104000400024101be02410400030001410100014101be014101000141030002000341010001be010003410200010002410100057e01000241010002410200057e02000241" }, { "filename": "14-kanagawa-curry-heads", @@ -1022,6 +1179,14 @@ "filename": "14-kanagawa-king-heads", "data": "0x0002171409070001210600070001a90600070001a90600060001a7011301a70500050001a7011301a7011301a70400040001a7011301a7011301a7011301a703000200012101a9012101a9012101a9012101a9012101a901210100030001b3014201270142012701420127014201b3020003000149011301270113012701130127014201490200010003a9012101a9012101a9012101a9012103a902000113014201b3012701b3012701b3012701b3014201130100020001420113014901270149012701490127014901130142010002000113014201b3012701b3012701b3012701b3014201130100020001420113014901270149012701490127014901130142010002000113014201b3012701b3012701b3012701b3014201130100020001420113014901270149012701490127014901130142010002000113014201b3012701b3012701b3012701b3014201130100020001420113014901270149012701490127014901130142010001a9012101a9012101a9012101a9012101a9012101a9012101a90121" }, + { + "filename": "14-kanagawa-shumai-heads", + "data": "0x00061a14060500048602c0048605000200068604c0068602000100088602c008860100010001af02d4038602d401af048602d4028601af010001d403af01d404af01d406af01d402af01d4010001d402af01d404af01d406af01d401af01d40100010001d402af01d40baf01d401af01d40100010003af01d40baf01d402af0100010004af01d409af01d403af0100010004af01d409af01d403af0100010004af01d409af01d403af0100010004af01d409af01d403af0100010004af01d404af037d02af01d403af0100020003af01d409af01d402af020003000eaf0300" + }, + { + "filename": "15-niigata-italian-heads", + "data": "0x00061b1505150001d2130002d2010005000c01010001d203000300020102d201bf011805bf02d2012b010101d2030002000101032b01bf012804bf0118012802bf01d2012b01d20101020001000101012b02d20bbf01d201bf01d2012b010101000101012b01d2012b07bf012807bf022b0101010101d2032b0dbf011802d20101010101d2022b0fbf012b01d201010101012b02d201180dbf02d2012b01010201042b0bbf032b020101000101012b01d2012b01d202bf012806bf012b02d2012b020101000100010101d2020101d2012b04bf011801bf012802d2012b04010100020001d2020101d20e010200020001d210010300020001d21300" + }, { "filename": "15-niigata-sasadango-heads", "data": "0x00021c1604100001e107000e00011b01e108000d00021b070002e10c00031b040004e101000b000129021b030006e101000800021b0129011b0129020007e10200050001290100021b0129021b0129010008e1020005000129031b0129011b0129011b08e103000500011b0129011b0329021b08e103000400021b0429031b08e103000400031b0229031b08e104000300031b0429011b01e103dd05e104000300021b0129011b0129021b012905dd03e105000300011b0129021b0129021b06dd03e1050003000129021b0129021b07dd02e106000100031b0229021b01e106dd03e10600041b0129021b01e102dd0197019801dd010101dd02e10700041b020002e1019702980197010101dd03e10700031b030003e101980197019801dd03e10800060009e10900070006e10b00" @@ -1048,7 +1213,7 @@ }, { "filename": "17-ishikawa-jibuni-heads", - "data": "0x00051a140608000423080005000a23050003000323011001230210072303000200102302000100042304e101b804d80523010001000323055c01e1046002b8032301000323016a01b804e101b804d803b803230223015f016a02b80483026004d802b802230223015f02b8051a012201b8046002b80223012302b8023401b80183021a0222018304d8026d01b80123010001230434061a0460026d0123010001000223023402490383031a04b802230100020003230249031a038302b8032302000300032301de0123038301b8012301de032303000400032301de052301880223040006000223018801de022301de01230600" + "data": "0x00051a140608000423080005000a23050003000323011001230210072303000200102302000100042304e101b804d80523010001000323055c01e1046002b8032301000323016a01b804e101b804d803b803230223015f016a02b80483026004d802b802230223015f02b8051a012201b8046002b80223012302b8023401b80183021a0222018304d8026d01b80123010001230434061a0460026d0123010001000223023402490383031a04b802230100020003230249031a038302b80323020003000523038301b8052303000400032301de022301880523040006000223018801de04230600" }, { "filename": "17-ishikawa-kinpaku-heads", @@ -1066,6 +1231,10 @@ "filename": "18-fukui-tojinbo-heads", "data": "0x00051c15050d00037407000800037402000374027205000500037203740272037402720274030005000372037402720374027202740300030002740372037402720374027202740300030002740372037402720374020502740300030002740372037402720374020502740300030002740372037402720374020502740300030002740372039902720374020502740300030002990372039902720374020502740300030002990305039902720374020502990300030002990305039902720399020502990300030002990305039902720399020502990272010003000299030503990205039902050299027201000100027702990305030c02050399020502990272017703000299030503990205039902050299027701000177010013770200" }, + { + "filename": "19-yamanashi-houtou-heads", + "data": "0x00041b14050800060d08000600020d0600020d06000400020d0a00020d04000300010d0e00010d03000200010d0400080e0400010d02000200010d0200020e02d801d501d8025702d8020e0200010d02000100010d0100020e02d8015701d501600222021b025701d8020e0100010d01000100010d010e01d8025701d8015702600322035703d8010e010d01000100010d01d80157026001d50222026001d5031b0257021b01d8010d0100010e010d01d8022202570422021b0357026001d501d8010d010e020e01d801220249011b0257031b025702d80122015702d8020e010e02d801570249021b02d802570522025702d8010e0100020e01d80160025706460122025703d8020e01000100040e01d8015706460222015701d8040e01000200050e010f0146010f0146010f014602d8050e02000300100e030005000c0e0500" + }, { "filename": "19-yamanashi-shingen-heads", "data": "0x00011c1604050001280d0001280400040001280f0001280300040001280f000128030004000228010005010100050101000228030004000228010101280901012801010228030004000101022802010328010103280201022801010300020004010428010101060128010601010428040101000100015501a90155040109280401015501a901550100015503a90155010101a901550128012901280129012801290128015501a90101015503a901550100015515a901550100045501a9055503a9055501a904550200020103550488035504880355020101000200030101550d88015503010100020004010d8804010100010005010d8804010100010005010d88040101000100050101230388012302880160012303880123040101000100050104230188036001880423040101000100050105880323048805010100010006010388012303880123038804010200010004010100010102000788010005010200010101000201010001010a000201010002010300" @@ -1078,6 +1247,10 @@ "filename": "20-nagano-matumotocastle-heads", "data": "0x00011f16020a00010d0300010d0e000a0001e3030d01e30e000a0001e3030d01e30e000800020d01e3030d01e3020d0c00090007010d000900030e0123030e0d000800090d0c000700050d01e3050d0b000900020101e3010101e302010d000800020d01e3030e01e3020d0c0006000d0d060001e30300040001e30200040103230401060001e3010101e30200030001e3010101e30100040e0323040e050001e3030e01e30100020001e3030e01e30c0d0300070d010007e30c0d0400030e02000200016602e302660c0104e3050d0100010006e3040e0523030e03e3070d08e30c0d080e010002000123018501230185050102660301036603e3070d01000618040e02bc030e04bc0136010e0136050101000200040101de03d802de02d801de03d801de023601970136050e0100060002d801de03d801de03d802de01d801de0197010e019702de01d801de01d801de" }, + { + "filename": "20-nagano-shinshusoba-heads", + "data": "0x00051b1505070008930200035e0200040003930257046002570193015e01930400030001930157046004570260015e0160015701930300020001930260035e01570160035e0157045e016001930200010001930257010202b1025e010202b1025e010202b1025e015701930100010001930160010f010201b1010f025e010201b10160025e010201b10157025e0160019301000193030f010201b1010f025e010201b1010f025e010201b10160025e0257019301930160020f0202035e0202035e0202035e02600193019303570102035e01600102035e01600102035e0357019301930360010202b1025e010202b1025e010202b1025e0260019301930357010201b10160025e010201b10157025e010201b10160025e02570193010001930260010201b10157025e010201b10160025e010201b10157025e0160019301000100019302570202035e0202035e0202035e0157019301000200019301600202025e019901b1019901b1019901570202025e0160019302000300019301570460045704600157019303000400039302570460025703930400070008930700" + }, { "filename": "20-nagano-wasabi-heads", "data": "0x0003161505040002220100024e08000100024e01000222034e08000122024e0222034e09000122034e0122014e0222090001000122034e032201c90122070002000622014e022206000200013f022201c9014e042206000200013f014e0622014e01c90500030001c90922040003000a22040003000422014e062203000400013f014e0522014e0322020005000922014e020005000b22010006000122014e082201000700042204850122014e080001c9014e062201c90a00013f06220c000322014e0100" @@ -1096,7 +1269,15 @@ }, { "filename": "21-gifu-ukai-heads", - "data": "0x00031e190404000b540b0003000d540a0011540900010004920d540800020002920f5407000300105407000300105407000200115407000200045401920c0c0700020002540f0c0700140c06000100040c0401050c01a6030c0101010c0600040c0601030c03a6010c020101f406000100030c0601010c07a6010101f406000200020c04010ea603ad01000200020c040103a603e901c601220210070001ad0300010c050103a603e901c60122021007000400010c050104a602e901c6021007000f0002e90122011001a602ad0400110001220110020002ad03001200012201100600110001c602e901c60500100001c6040001c60400" + "data": "0x00031e190404000b540b0003000d540a0011540900010004920d540800020002920f540700030010540700030010540700020011540700020005540c0c0700020002540f0c0700140c06000100040c0401050c01a6030c0101010c0600040c0601030c03a6010c0201010c06000100030c0601010c07a60101010c06000200020c04010ea603ad01000200020c040103a603e901c601220210070001ad0300010c050103a603e901c60122021007000400010c050104a602e901c6021007000f0002e90122011001a602ad0400110001220110020002ad03001200012201100600110001c602e901c60500100001c6040001c60400" + }, + { + "filename": "22-shizuoka-eel-heads", + "data": "0x00031a1405110002950200020004230b000196029501000100022301ec01010223090002230196029501df0223020103230700032302960195019601df062306000323040001df019601df022302950123050003230500010001df03230296012305000523030002000623050006230200030005230600062301000300052308000523030005230900042303000523090004230300062307000423010003001123010004000f23020004000f23020005000d23030006000a230500" + }, + { + "filename": "22-shizuoka-hamamatsu-gyoza-heads", + "data": "0x00021b16050c00013409000b000234090003000134060001340157013409000400013404000134018e0157013403000334010001340100030001340157013401570200018e0157018e0134020001340157018e01570134020003000134018e0157013401570100028e015701340200018e02570134030003000134035701340257018e0157018e01000134025701340157030004000134018e0257018e0100035701000257013401570400060001340357030b01290157018e015705000634018e0157068701570100028e013401570200010001340257018e0257080b028e0157018e013401570100010001570134018e0157028e070b01000257018e025701340100020001570134028e010007870157018e063405000157018e0157030b0129020b015701340600040001570134025706870257018e0134040003000157013402570134018701340157028e01570134035701340300030001340257018e01000129030b018e0100015701340157018e01340300020001340157018e01570134020001340157018e0134020001570134015701340300010001340100033403000134015701340157040001340400090002340157060001340300090001340c00" }, { "filename": "22-shizuoka-oden-heads", @@ -1106,6 +1287,10 @@ "filename": "23-aichi-hitsumabushi-heads", "data": "0x00071a15060800040e08000500050e0134040e05000300040e0234012b013401350134040e03000200010e010b033401350234012b023401350334010e02000100010e010b0134012b03340135053401350234010b010e01000100010e01350234012b0634012b033401350134010e0100020e0834013506340135020e020e023401350234012b033401350334012b0234020e020e010b023401350b34012b020e030e010b093401350334030e050e023401350234012b03340135050e0100080e0234080e01000100120e01000200100e020004000c0e0400" }, + { + "filename": "23-aichi-nagoyacastle-heads", + "data": "0x00021b15010b0001da070001da06000b0002da053f02da06000b00093f06000a000b3f05000b00010101e3010101e3010101e3010101e301010600090001210b3f012104000900063f0101063f04000a000501013f050105000900013f010102580121013f010e013f012102580101013f04000900043f050e043f040001e307000f3f0300010101e3050002210d010221020003e304000221013f010e013f0101015801010158010101580101013f010e013f02210200020104000121023f030e073f030e033f0121015801010400143f03e30400016f01580101015801010158016f0158016f0158016f01580101015801010158016f0158010004e3020014e3030104000101015801010158020101580101015801010158020101580101015802010100030104e301780105015901630178025902dd0259010502dd01590163015901050100015e0159015e040101d8015e0178025e0163025e01d8015e0178035e0178015e01d8015e0100" + }, { "filename": "23-aichi-tenmusu-heads", "data": "0x00011b1406090001ce010001ce0900090003ce0900090003ce0900090003e70900070001bc05e701bc0700060001bc010105e7010101bc0600050001bc010107e7010101bc0500050001bc020101e7030101e7020101bc0500040003bc070103bc0400040005bc030105bc0400030007bc010107bc030003000fbc0300020010bc0300020011bc0200020011bc0200020011bc0200010013bc0100010007bc010101bc010101bc010107bc010015bc15bc" @@ -1114,9 +1299,13 @@ "filename": "24-mie-jingu-heads", "data": "0x00041e14010100012a0200012a1200012a0200012a02000200017e0100017e1300017e0100017e02000300017e0100012a0100012a0100012a0100012a0100012a0100012a0100012a0100012a0100012a0100012a0100017e0300027e19c6027e020019ab020001001bab010001001bab01000eab01880eab0cab05880cab0aab028802d8018802d802880aab020001d805d3028804d8018804d8028805d301d80200020001d803d3118803d301d802000160010001d801d3028801d301880dd3018801d3028801d301d801000160076001880d60018807600160010001d801d301600200018801600bd3016001880200016001d301d8010001600160010001d801d301600200018801600bd8016001880200016001d301d8010001600160020001d301600200018801600bd3016001880200016001d302000160" }, + { + "filename": "24-mie-meotoiwa-heads", + "data": "0x00071d1403070005c10e00080001c1010001c10f000700017401c1017401c10f00070005740e00050008600d000500087401600c0005000874010001600b0004000974010001600b0003000a740200016003000374040003000a740200016002000560030002000b740300026001000474030002000b740200038b01000474030001000c74060006740100078b02000a8b0100048b0100018b" + }, { "filename": "24-mie-ninja-heads", - "data": "0x00041717050700069205000500039201bc069203000400039201bc059201bc029202000400039201bc069201bc019202000300039201bc01e302da010101da010101da01bc029201000300039201bc01e301da01e3010101da010101da01e301bc019201000200039201bc0a880292020003920b880292020003920b880292020003920b8802920200039203a2078801a20292020003920ba20292020003920ba20292030003920aa2019201000300039209a2029201000200059202a2039203a201920200020002920100039206a202920200010003920300029204a202920300010003920e0002921000" + "data": "0x00041817050700079205000500039201bc079203000400039201bc069201bc029202000400039201bc079201bc019202000300039201bc01e302da010101da010101da01e301bc029201000300039201bc01e301da01e3010101da010101da02e301bc019201000200039201bc0b880292020003920c880292020003920c880292020003920c8802920200039203a2088801a20292020003920ca20292020003920ca20292030003920ba201920100030003920aa2029201000200059202a2049203a201920200020002920100039207a202920200010003920300029205a202920300010003920f0002921100" }, { "filename": "25-shiga-blackbass-heads", @@ -1126,6 +1315,14 @@ "filename": "25-shiga-hikonecastle-heads", "data": "0x00021d15020a00010d0700010d0800090001bc090001bc070009000bbc070009000bbc0700090004bc010d01eb010d04bc0700080003bc01eb010d0301010d01eb03bc06000900020101a2050101a202010700080001ab010103a20101010d010103a2010101ab0600070006bc010d0101010d06bc0500060006bc010d0301010d06bc040007000401010d0501010d04010500040003bc0101010d010109bc0101010d010103bc0200040003bc010d0101010d010101a2020101a2020101a20101010d0101030d01bc0200030002bc020d03bc020d05bc020d0101020d0201010d01bc01000400030101a202ab030101a202ab0301080d0100120d07010100010d0101120d060101000301120d010101a201ab020101000101017404010174020101740201017403010174030106ab01000101017412010700" }, + { + "filename": "25-shiga-shigarayaki-heads", + "data": "0x00041b15040700010a0250010a0250010a0150080005000250010a0250010a0250010a0450050003000150010a0f50030002000250010a035005850350048501500200020004500b850297028501500100010004500d8502970185015001000100035003850388028504880385019701850250045002850b8804850250025003850d8802850350015004850d880285035001500185019702850d880285035001500185029701850d8802850250010001500285019701850c88038502500100025004850b8803850250010001000350048501880101012301010123010106850150020001000350088502880585025002000200035007850388048501500300040001501200" + }, + { + "filename": "26-kyoto-gojunotou-heads", + "data": "0x0001181409070001210700070001a907000700012107000500010d01bc010d01bc010d05000300010d01bc010d01bc010d01bc010d01bc010d030001bc010d01bc010d01bc010d01bc010d01bc010d01bc010d01bc010d01bc01a90200019701b6019701b6018401b6019701b60197020001a9020001bc010d01bc010d01bc010d01bc010d01bc010d01bc020001bc010d01bc010d01bc010d01bc010d01bc010d01bc010d01bc010d01bc01a90200019701b6019701b6018401b6019701b60197020001a9020001bc010d01bc010d01bc010d01bc010d01bc010d01bc020001bc010d01bc010d01bc010d01bc010d01bc010d01bc010d01bc010d01bc01a90200019701b6019701b6018401b6019701b60197020001a9020001bc010d01bc010d01bc010d01bc010d01bc010d01bc020001bc010d01bc010d01bc010d01bc010d01bc010d01bc010d01bc010d01bc01a90200019701b6019701b6018401b6019701b60197020001a9020001bc010d01bc010d01bc010d01bc010d01bc010d01bc0200010d02bc010d01bc010d01bc010d01bc010d01bc010d02bc010d01a90200019701b6019701b6018401b6019701b60197020001a903000397038403970300" + }, { "filename": "26-kyoto-kinkaku-heads", "data": "0x00011d15020c00026d010001290b000d00016d01a60c000c00010102290c000c0003b8060001b80500040001b8030004b801a6018506b8018506000500018504b803a605e60900080002a601e40129010101a6016d01a6016d01a6090007000129016d018a016d018a0129018a016d01a6016d018a02290700060008b8028504b80700020001850ab8018504e606b801850200040001290100012907a60101012901e4012901e6012901e601290500040001290100012904e403290101012901e4012901e4012901e402290400030006290e850400030006850135018501a00135018503010185010101850101018505000400018501a0018501a00135010a018501ea010a018501ea023505850500040001850100018502ea010a018501ea010a018501ea0235018501010185010101850500030013850500030001b6015701ab015701b6015701b6015701ab0157019808570500020002a5015901ab01a501b6015901a5015901ab015902a5025901a5015901a5015904a5010001a5030002a5028502a5010a018502a5018501a5028502a50185010102a5040001a5010002a5018501a0018502ea010a018501ea01a5018501a50235028502a5018502a50300" @@ -1134,6 +1331,10 @@ "filename": "26-kyoto-kiyomizu-heads", "data": "0x00061a14051584010801970208019702080197020801970208019702080197020801970108010001840200018402000184020001840200018402000184020001840100010801970208019702080197020801970208019702080197020801970108010001840200018402000184020001840200018402000184020001840100010801970208019702080197020801970208019702080197020801970108010001840200018402000184020001840200018402000184020001840100010801970208019702080197020801970208019702080197020801970108010001840200018402000184020001840200018402000184020001840100010801970208019702080197020801970208019702080197020801970108010001840200018402000184020001840200018402000184020001840100010801970208019702080197020801970208019702080197020801970108010001840200018402000184020001840200018402000184020001840100010801970208019702080197020801970208019702080197020801970108010001840200018402000184020001840200018402000184020001840100" }, + { + "filename": "27-osaka-osakacastle-heads", + "data": "0x00021b1406070001da050001da07000700073f07000700073f07000600043f01e3043f0600070001e301ad03e301ad01e30700040001da0100010e01e7010e01e7010101e7010e01e7010e010001da040004000221023f012103010121023f02210400040001210b3f01210400040002210101015802010158020101580101022104000300072101a607210300010001da02000401013f0301013f0401020001da01000100032101010158013f01a601010358010101a6013f015801010321010001000121113f012101000100043f01a6093f01a6043f0100010001210101013f0301013f01580101015801010158013f0301013f0101012101000100022101a601580101015801a6013f0321013f01a601580101015801a6022101001521010002c102580101015802c1035802c101580101025802c10100010013010100" + }, { "filename": "27-osaka-takoyaki-heads", "data": "0x00021e15020b0001af010001af020001af027d0900090001af027d01af0100017d01af010002af09000600017d010001af017d03af017d01af020b017d010003af060003000157020001af017d02af017d01af020b01af0134017d013401af027d0700040001570100017d01af010b01af0134010b01af01dd0134010b037d010b010001af0600050001570100010b02af01dd01af013402af017d0134010b03af010001af05000600015701af023401af010b02af010b023402af020b01dd01af050006000134010b02af010b0234010b0234020b0111010b0234010b050005000134020b0134010b013401af020b0211010b01dd0111010b0111010b01340200027f0100050001dd010b0534010b01110260020b0260020b01340100017f0200017f0500020b0134010b0234020b0111019302600293036001110100037f010005000334010b0134020b0b60050005000234020b0134010b01110260039303600393050005000134010b0234010b013401110b6005000600040b0111046002930560060006000134010b0234011101930134019305600293016006000200037f0200023402110160053404600700017f0300017f0300013401110260013403600293026008000100037f03000234011101930134076009000b00036003930b00" @@ -1142,6 +1343,10 @@ "filename": "27-osaka-tower-heads", "data": "0x000216150b05000195050004000395040002000195063c020003000195043c0300040003c604000100016f0195016f01c6019501c6016f0195016f01000295016f019501c6019501c60195016f02950100016f0195016f01c6019501c6016f0195016f01000300019501c6019501c6019503000300019501c6019501c6019503000300019501c6019501c6019503000200029501c6019501c6029502000200029501c6019501c6029502000200029501c6019501c60295020001950a3c0195033c01a2013c01a2043c0100016f039501a20395016f010001000195016f019503000195016f019501000100016f019505000195016f010001000195070001950100" }, + { + "filename": "28-hyogo-arimaonsen-heads", + "data": "0x0003171409020003a60900010001e704a6080001e703a6012904a6050001e706a6012902a6040001e708a605000100016d01e703a60400019d014602000200016d02ea05000106012802000a00019d014602000a00019d014602000a00019d014602000a00019d014602000a00019d014602000a00019d014602000a00019d014602000500049d0106019d0128020003000406010005ce0100020001060301030001ce012901ce0229010003010106020006ce0100" + }, { "filename": "28-hyogo-himejicastle-heads", "data": "0x00021a15010b00017f0700017f05000c0007e006000c0001e0019d01e0019d01e0019d01e006000b0002e0019d0301019d02e005000c00070106000c00010101920101019d01010192010106000800017f020001e0019d01e0019d0101019d01e0019d01e00200017f0200090001e0019d01e0019d01e0019d01e0019d01e0019d01e0019d01e003000700017f02000101029d01010192010101920101029d01010200017f01000800017f01e0019d0201019d03e0019d0201019d01e0017f02000300017f040002e005010192050102e0020003e00500017f01e0010101920101019201e0010101e00192010101920101027f020001e0019d02e00300019d01e0019d01e0019d01e0019d0301019d01e0019d01e0019d01e0019d01000192010101920300037f040105920501020001e0019d01e0019d01e00100037f010101920101079201010192020102000101019201010192010101e0019d01e0019d01e0019d01e0019d01e0019d01e0019d01e0019d01e0019d01e0019d01e0019d019d01e0019d01e0019d01e0019d016f0201019201010192010101920101019201010192010101920201016f01000192010101920101019201010192100102000401019d01e0019d01e0012b0250012b0350012b0250012b0350012b0200012b0150012b015001920101019201010250012b0250012b0250012b0350012b02500200" @@ -1154,6 +1359,10 @@ "filename": "29-nara-ashura-heads", "data": "0x00021f140203180a00019f01c2019f0a000318020002e40700029f03c2029f070002e40200020002180600029f05c2029f0600021802000200021806000118019f01c2031801c2019f01180600021802000200021806000123021801230118012302180123060002180200020002180600091806000218020002000218060001230218032302180123060002180200020003180600071805000418020003000418060003180400021801dd031803000500021801dd041801e4031801e401dd041801dd010002e4030003000118030001dd041801e4031801e401dd0218040002180300020003180400041801e4011801e401dd0318040002180300020002e40400011801dd061801dd021801dd021802000218030002000218020001dd031801dd021801e4011801e401dd011801dd031801dd010002180300020003180100011801dd061801dd061801dd0418030003000a1803dd051802000218040004000218010003180100011803dd031801000318070007000218030002dd03180300021807000c0005180c00" }, + { + "filename": "29-nara-daibutsu-heads", + "data": "0x00041715080500018a0150018a0150018a015004000400018a0150018a0150018a0150018a0150030002000150018a0150018a0150018a0150018a0150018a0150018a010001000150018a0150018a0150018a0150018a0150018a0150018a0150018a0100018a0150018a0150070a0150018a015001000150060a0126060a0100010a0550030a0550010001500d0a080a0150060a0f0a080a0150060a0150070a0150060a0150070a0150060a0150060a0350050a01500e0a0150060a0350050a01500e0a01500e00" + }, { "filename": "29-nara-deer-heads", "data": "0x00051b140702110a000211060001110138011108000111013801110600011102380135060001350238011106000111033801350400013503380111060001000111025702350200023502570111070002000a11080002000a11080002000a11080002000a11080002000a110800020001350e110323020001350511095703230200013505110c5702000135010b041101230b5702000135051101570223095701000135010b0111010b03110c57" @@ -1166,17 +1375,53 @@ "filename": "30-wakayama-nachifall-heads", "data": "0x000216150a0100036102e001610101046101610327020101e001010227016101000227019d012701e0010101e0010103270100039d016201e00301026202000400010101e0010101e004000400020101e001010400040001e0030104000500010101e001010400050001e0020104000500030104000500020101e00400050001e0010101e004000500010101e001010400050003010400050003010400050003010400030001010100016201010162010102000101050001010162020103000500020101000101010001010100020001010100010101000101010001010300" }, + { + "filename": "30-wakayama-wakayamaramen-heads", + "data": "0x00041b150508000633080006000233060102330600040002330a010233040003000133040106d804010133030002000133030102d8016001d8017d026003d803010133020001000133020103d80260037d01d80160025b02d802010133010001000133010102d8027d0160047d010f035b016002d80101013301000133020101d8067d030f017d025b026001d8020101330133010101d8077d030f046003d8010101330133010101d8067d040f066001d8010101330133010102d8057d040f066001d8010101330133020101d80160047d040f056001d80201013301000133010101d8067d076002d801010133010001000133020101d8047d0160026c01d8026001d8016001d802010133010002000133020101d8027d0160016c02c1016c01d8026001d802010133020003000133020102d80160016c02c1016c016002d802010133030004000133030102d8026c02d803010133040006000133080101330600" + }, + { + "filename": "31-tottori-camel-heads", + "data": "0x00051f140604000155070001460c00030001540155015405000154014601540b0002000254015502540300025401460254040003d80300010003540155025403b10254015503540200038a02d80200010003540155025404b1015401550354020001d8028a0223018a014601000454025504b101550454020002d8038a014601d80100028a045404b10454018a0200014601d8038a014601d80100048a0854038a020001d80246018a014601d8010c078a0454058a01d80100038a01460300168a01460200158a02000246158a04000100138a05000100068a05b1078a06000200108a070003000e8a0800" + }, + { + "filename": "31-tottori-crab-heads", + "data": "0x00041f14010700041402d4050002d404140600050004140d0004140400040004140f00041403000300031404d404000214050004d40314020002000214080001140123023301230114090002140100010002140800081409000214021408000a14090001140100071401000c1401000814080001880c1401880800071401880e140188071408000e140800071401880e140188071408000e1408000100061401880e1401880614010008000188041404330414018808000300061401880a140188061403000a000a880a00" + }, + { + "filename": "31-tottori-pear-heads", + "data": "0x00041a140605000522016b04220500030006220179016b01790522030002000222014e0d22020002000122014e0e22020001001222010001000122014e102201000222014e11220222014e112214221422142214220100122201000100122201000200062202ac0822020002001022020003000e220300" + }, + { + "filename": "32-shimane-black-throat-heads", + "data": "0x00011f15020d0003240d000b000347012403470b0009000b47090008000d4708000700024704010347040102470700070002470323010103470101032302470700060003470401034704010347060006001147060004240200013902470b64024701390200042401000524023901640101090d01010164023905240100020004240139016401010b0d0101016401390424020004000224013901640d0d01640139022404000600013901010d0d0101013906000600013901010d0d0101013906000600013901010d0d0101013906000600010101640d0d0164010106000600010101640d0d01640101060006000101016401010b0d0101016401010600070002640101090d0101026407000700010102640901026401010700080001010b6401010800" + }, + { + "filename": "32-shimane-castle-heads", + "data": "0x00011b140607000195050501950700060009050600070003720105037207000700020c010501660105020c070006000305036603050600050003050166030c01660305050003000f050300040002b5097202b50400030003050166010c0266010c0266010c0166030503000100130501000200060c0105030c0105060c02000200040c0205050c0205040c020015050200040c0966040c02000200040c038603720386040c0200020002de02c903860372038602de02c90200020002c902de097202c902de0200010001c902de02c902b5050c02b502de01c901de01c90100010001de02c902de010201d802b502d8020201d802c901de01c901de0100010001c902de02c902d802b504d8010202de01c901de01c90100" + }, + { + "filename": "32-shimane-soba-heads", + "data": "0x0004181608040008850400020002850811028502000100018502110172070502110185010001850111030501720123017201710172014c0172020501110185018501050372020501230271013e01dd027201050185011101850305017201230172012301dd014c0172020501850111011101cc0285080502850211011102cc0133088502330211013402cc053304b40233011101340111018501cc0111043304b40133011101850111011101cc02850411043302850211011102cc0133088502330211013402cc053304b40233011101340111018501cc0111043304b40133011101850111011101cc02850411043302850211011102cc01330885023302110100011101cc053304b402330111010002000211043304b40133011102000400041104330400" + }, + { + "filename": "32-shimane-zenzai-heads", + "data": "0x00051a140606000823060003000323083403230300020001230e34012302000100012304340338018503d105340123010001230334018505380185038802d10334012301230134038505380588018402d1013401230111012308850588038501230111021101230284028502840185028403850184018501230211011101cc011103230685028403230311011101cc041108230611011102cc11110100011101cc101101000100011101cc101101000200071104340511020002001011020003000e110300" + }, + { + "filename": "33-okayama-castle-heads", + "data": "0x00031e16010e00020c0d000d00040c0c000c00020c0266020c0b000b00020c016602590166020c0a000a00020c0666020c090009000c0c08000a00016601590166015901660159016601590166015909000a00016601590166040c01590166015909000900040c0466040c08000600050c026604590266050c050003660400010c055904660559010c060004660100030c01590166012301590166015901660159016601590166012301660159040c03000366050c01590166012301590166015901660159016601590166012301660459040004000359110c0400016604000366110c030002660400010c0123010c026001d801600899016001d8026001d8020003660400010c0123010c02d8016001d8026002d8016001d8016002d8016002d80160050002000366020c026001d8016002d8026001d8016001d8026001d801600366040007660d000766020008660b000a66" + }, { "filename": "33-okayama-denim01-heads", - "data": "0x00061815090a54042b01540799010c0299042b01990754019907540154059901540199015405990154015401f5035401f501540199015401f5035401f501540754019907540754019907540754019907540754010007540754010007540754010007540754010007540754010007540799010007990706010005060101015407060100050601010154" + "data": "0x00061815090a54042b01540799010c0299042b019907540199075401540599015401990154059901540754019907540754019907540754019907540754019907540754010007540754010007540754010007540754010007540754010007540799010007990706010005060101015407060100050601010154" }, { "filename": "33-okayama-denim02-heads", - "data": "0x00061815090a92042b01920799010c0299042b01990792019907920192050c019201990192050c0192079201990792079201990792079201990792079201990792079201000792079201000792079201000792079201000792079201000792079901000799079d0100059d010101f6079d0100059d010101f6" + "data": "0x00061815090a92042b01920799010c0299042b01990792019907920192050c019201990192050c0192079201990792079201990792079201990792079201990792079201000792079201000792079201000792079201000792079201000792079901000799079d0100059d01010192079d0100059d01010192" }, { "filename": "33-okayama-denim03-heads", - "data": "0x00061815090a92042b019207ca010c02ca042b01ca079201ca07920192050c019201ca0192050c0192079201ca0792079201ca0792079201ca0792079201ca079207920100079207920100079207920100079207920100079207920100079207ca010007ca079d0100059d014d01f6079d0100059d010101f6" + "data": "0x00061815090a92042b019207ca010c02ca042b01ca079201ca07920192050c019201ca0192050c0192079201ca0792079201ca0792079201ca0792079201ca079207920100079207920100079207920100079207920100079207920100079207ca010007ca079d0100059d014d0192079d0100059d01010192" }, { "filename": "33-okayama-dog-heads", @@ -1232,7 +1477,11 @@ }, { "filename": "35-yamaguchi-anglerfish-heads", - "data": "0x00091f15020c0005830c000900048301660683090008000a830266018308000100013403000f83016603830300013401000234020002830266118302000234033402830166068301f7038301f709830334023402830166118301660483023401000134098307090483016604830134010002000283016603830d0906830200030004830109035f0166055f0166035f01090483030004000283010901660d5f0166010902830400040001830109018302090166015f0166015f0166015f0166015f0166015f0166020901830109050009000b090900" + "data": "0x00091f15020c0005830c000900048301660683090008000a830266018308000100013403000f83016603830300013401000234020002830266118302000234033402830166068301230383012309830334023402830166118301660483023401000134098307090483016604830134010002000283016603830d0906830200030004830109035f0166055f0166035f01090483030004000283010901660d5f0166010902830400040001830109018302090166015f0166015f0166015f0166015f0166015f0166020901830109050009000b090900" + }, + { + "filename": "35-yamaguchi-footballfish-heads", + "data": "0x00031f15020900023402eb100008000134040001eb01da0e0007000134050001da015d01da0d0007000134040001da015d0101015d01da0c0008000134040001da015d01da0d000900023401eb020001da0e000c0002eb03830c0009000483016601eb0583090008000683013403830266018308000100013403000f83016603830300013401000234020002830266118302000234033402830166068301230383012309830334023402830166118301660483023401000134098307090483016604830134010002000283016603830d0906830200030004830109035f0166055f0166035f01090483030004000283010901660d5f0166010902830400040001830109018302090166015f0166015f0166015f0166015f0166015f0166020901830109050009000b090900" }, { "filename": "35-yamaguchi-fuku-heads", @@ -1240,32 +1489,48 @@ }, { "filename": "35-yamaguchi-kawarasoba-heads", - "data": "0x00051e1504030001061600010002060700019e0300019e08000106020001060900019e0300019e0900010601000106080001da010101da010001da010101da05000306020001000306040001d0012301d0012301d0012301d0012301d00900040001060200011501230115012301150123011501230115012301150200010605000400010601000d1503000206020001000306010001eb01e601eb01e601eb01e603eb01e601eb01e601eb01e601eb0400010601000106040001eb01e601eb01e601eb01e603eb01e601eb01e601eb01e601eb05000106010604000fe80300020601000100010603000fe802000106030002000106010011e8010001060300040002e80d2302e80200010602000300010c02230d0c0223010c04000200040c0d00030c01230200010c0200020c1100020c0223010c0200010c1300030c0100" + "data": "0x00051e1504030001061600010002060700015503000155080001060200010609000155030001550900010601000106080001da010101da010001da010101da05000306020001000306040001d0012301d0012301d0012301d0012301d00900040001060200011501230115012301150123011501230115012301150200010605000400010601000d1503000206020001000306010001eb01e601eb01e601eb01e603eb01e601eb01e601eb01e601eb0400010601000106040001eb01e601eb01e601eb01e603eb01e601eb01e601eb01e601eb05000106010604000fe80300020601000100010603000fe802000106030002000106010011e8010001060300040002e80d2302e80200010602000300010c02230d0c0223010c04000200040c0d00030c01230200010c0200020c1100020c0223010c0200010c1300030c0100" }, { "filename": "35-yamaguchi-shoin-heads", "data": "0x00031715070100030c0c000200050c09000400060c060002000d23010001000f2301000223048805230388012302230e8802230e8802230388032304880323018801230f880588032304880323018806880123028801ca0288012303880a8801ca05880a8801ca05880200088801ca05880200058802ca018801ca018801ca03880200048801ca028802ca028801ca028803000c880100050009880200" }, - { - "filename": "35-yamagudhi-footballfish-heads", - "data": "0x00031f15020900023402eb100008000134040001eb01da0e0007000134050001da015d01da0d0007000134040001da015d0101015d01da0c0008000134040001da015d01da0d000900023401eb020001da0e000c0002eb03830c0009000483016601eb0583090008000683013403830266018308000100013403000f83016603830300013401000234020002830266118302000234033402830166068301f7038301f709830334023402830166118301660483023401000134098307090483016604830134010002000283016603830d0906830200030004830109035f0166055f0166035f01090483030004000283010901660d5f0166010902830400040001830109018302090166015f0166015f0166015f0166015f0166015f0166020901830109050009000b090900" - }, { "filename": "36-tokushima-awa-odori01-heads", - "data": "0x000118140d010002f80800010004f8030001f90200010006f8010001f90200010007f801060200020005f80106020001f90200012303f90106030001f9030003f9030001010100010003010267030102000401026701010400030103670500039e0367050002e2019e0367050004e2014f060002e2044f05000200044f050001000144044f050001000344014f06000300010107000200010108000200012301440700" + "data": "0x000118140d010002d80800010004d8030001880200010006d8010001880200010007d801060200020005d80106020001880200012303880106030001880300038803000101010001000301026703010200040102670101040003010367050003890367050002e201890367050004e2014f060002e2044f05000200044f050001000155044f050001000355014f06000300010107000200010108000200012301550700" }, { "filename": "36-tokushima-naruto-wakame-heads", "data": "0x00021a15070b000194035c04940b000348035c02480b00035c0100025c02000b00035c0200015c020004000748035c01480400020002480723035c012302480200010001480923025c0423014801000148042306de015c02de042301480148022302e90bde022301480148012304e905de015c05de01230148014807de045c06de0148014805de055c07de0148014806de035c03de02e903de014801480bde04e902de0148014811de014802480fde0248034801de055c07de034801001148010002000f48020004000b480400" }, { - "filename": "36-tokusima-whirlpools-heads", + "filename": "36-tokushima-whirlpools-heads", "data": "0x00011d15030800010111000700010101300101058d040001010600090001300601020001010130010105000600018d0300073002000130010105000500018d010102300801018d02000130018d04000400018d01010130018d0101088d0101028d01300101018d030001000101028d0101013001010130038d0530028d0101028d01300101018d0200010101000201023001010130018d013006010130028d0101028d013001010200040002010130028d01010330028d02010130028d0101018d01300300040001010130018d013001010130068d02010130028d010101300300030001010130018d013001010130028d0401028d02010130018d010101300300020002010130018d01010130028d0101038d0201018d02010130018d0101013003000100010101000130028d01010130018d0101028d0101028d0101028d01010130018d01010130020101000100010101000101028d01010130018d0101018d0101038d0101028d01010130018d010101300101010001010100010102000101018d01010130018d0101028d0101018d0101038d01010130018d010101300200010102000201038d0130018d0101078d01010130018d010101300100020101000400018d0101018d0130018d01300101058d01010130028d01010130010103000500013001010130028d013005010130028d0101018d01300101030005000130018d01010130028d0530028d0101018d0130010104000600023002010130058d0201018d0130010105000a0006010a00" }, { "filename": "37-kagawa-bonsai-heads", "data": "0x00021d14040900071b09000700051b020f031b08000600010f041b040f031b07000500030f011b070f011b0200040f02000400070f04ca0300010f041b02000400050f04ca020f011b02ca031b030f01000b0001ca020f031b0200011b040f01000700031b010f0100010f051b07000600051b010f030003ca07000500031b03ca010f020004ca0100051b01000200021b030001ca030009ca031b020f0100011b020f011b010001ca050004ca0300011b02ca030f011b040f02ca040003ca0500020f0100020f0100060f040003ca0c00090005ca0b00090007ca09000600015401010354048c045406000600015401010b54060007000154010109540700" }, + { + "filename": "37-kagawa-castle-heads", + "data": "0x00021b14050a0002270a0009000127027f0127090008000127017f0258017f0127080007000127017f0458017f0127070005000c27050006000258010c04b5010c025806000600027f060c027f060006000a7f060004000e27040002001227020004000558040c055804000400017f010c027f010c0401010c017f0158010c017f04000400027f020c0101047f0101020c027f0400020012270200162702000158057f0c5802000200015805010c7f02000200010c02b5017402b5030c0174040c0174030c02000200010c05b50c0c0200" + }, + { + "filename": "37-kagawa-udon01-heads", + "data": "0x00011d15031100010b01e9010b06000f0001de010b01e9010b07de0f0001d8010b01e9010b07d81000010b01e9020b01e9050009000701010b01e9020b01e9050006000301074b010b01e9020b01e90500040002010a4b010b01e9020b01e90101040002000201054b0760010b01e9010b014b01e9014b0201020001000101054b0260080b01e9010b014b01e9034b0101010001000101034b0260020b07e9010b01e9010b016001e9034b010101000101034b0160020b02e9010b03e9040b01e9010b02e90160034b01010101024b0160010b02e9020b01e9030b03e9010b01e9020b01e90260024b01010101024b010b01e9020b02e9010b03e9070b01e9010b0160024b01010101024b020b02e9020b01e9030b05e9010b0157020b0160024b010101720101014b015701e9020b06e9050b01e9010b0157010b0160014b0101017201720101024b015702e9060b06e9010b0257024b01010172010001720201014b025706e9060b0257014b020101720100020002720201014b0257040b04e90257014b020102720200030002050172030104e9040b0301017202050300050002050272080102720205050008000a050800" + }, + { + "filename": "37-kagawa-udon02-heads", + "data": "0x00051d150309000801090006000301084b03010600040002010e4b0201040002000201054b0860054b0201020001000101054b0260080b0260054b0101010001000101034b0260020b07e9010b01e9010b0260034b010101000101034b0160020b02e9010b03e9040b01e9010b02e90160034b01010101024b0160010b02e9020b01e9030b03e9010b01e9020b01e90260024b01010101024b010b01e9020b02e9010b03e9070b01e9010b0160024b01010101024b020b02e9020b01e9030b05e9010b0157020b0160024b010101720101014b015701e9020b06e9050b01e9010b0157010b0160014b0101017201720101024b015702e9060b06e9010b0257024b01010172010001720201014b025706e9060b0257014b020101720100020002720201014b0257040b04e90257014b020102720200030002050172030104e9040b0301017202050300050002050272080102720205050008000a050800" + }, + { + "filename": "38-ehime-castle01-heads", + "data": "0x00011914050e0001b505000e0001b505000d0001b5010101b504000b0002b5030102b502000100090c09b501000100090c010002010323020102000b0c020801b5010101b50208020001000401010c040103b5010101b5010104b50100010101230101010c0101010c010101230101030801b5010101b5030801000b0c02b5030104b501000901090801000100030c0385030c0ab5010009850908010001000263027202630272016302d7020502d7020501d70100010002720263027202630172020502d7020502d70105010001000263027202630272016302d7020502d7020501d70100010002720263027202630172020502d7020502d70105010001000263027202630272016309b1010001000272026302720263017209c9010001000263027202630272016309b10100" + }, + { + "filename": "38-ehime-castle02-heads", + "data": "0x00011a1406050001b5090501b5040005000b05040004000d0503000300050502010105020105050200050004010105010101050401040005000101017201010105030101050101017201010400040004050501040503000200110501000300020101050901010502010200030001010105010101050201037202010105010101050101020002000205030107050301020501000b0506b503050200080102b5040102b5010101000200020102720501018504050185020101000200090101850405018502010100020009b1018504b6018502b1010001000a9902b1029902b1029901b101000786019902b1029902b1029902b101990100079901b1029902b1029902b1029901b101000786019902b1029902b1029902b10199" + }, { "filename": "38-ehime-iyokan-heads", "data": "0x00051a140604000c4204000200084201e1074202000100024201250f42010002420125114201420125124201420125124214421442144214421442144214420100054203b30a42010002001042020003000e420300" @@ -1302,10 +1567,26 @@ "filename": "39-kochi-bonito-heads", "data": "0x00041d15020f0001260b00100001260a000f0002260a0006000126070003260a0007000126040006260900060002260c54070006001054050005000354065601540556045403000154030003540f56035402000156015401000154025606540a56010101230254010002560100035610060201025601540106025616060296025601001506019602e901560154020003e9015412e901000154040003e9095408e90200060012e90300060002260ee90500050001260b0002260800" }, + { + "filename": "39-kochi-castle-heads", + "data": "0x00011a140609000227090008000127025801270800070001270158027f0158012707000600082706000700065807000700017f040c017f0700060008a206000600087f060004000c270400050003580162022701620358050003000227037f0127027f0127037f0227030003000227017f01620127017f0258017f01270162017f0227030003000227017f0127017f0458017f0127017f0227030002000427017f0658017f04270200142701001258010014270100025802d4045802d4045802d4025801000100027f02d4047f02d4047f02d4027f01000100017f015802870158027f015802870158027f015802870158017f0100" + }, + { + "filename": "39-kochi-eggplant-heads", + "data": "0x00011915070600050e07000500070e06000400090e05000300060e01e5040e04000300050e01e5011201e5030e04000300040e01e5011201900112040e03000200030e01e50212029001b70112030e0300010e0100010e01e50212049002b70112030e02000100010e0212069004b7020e0100010e0200099004b7020e01000200099004b7030002000a9004b7020001000b9004b7020001000c9004b7010001000c9004b7010001000d9004b701000d9002b7010101b7010001bc0c9002b7010101b7010001bc0c9004b7020001bc0a9004b701000300049002b7019006b70200" + }, + { + "filename": "40-fukuoka-hakataramen-heads", + "data": "0x00041b150508000692080006000292060102920600040002920a01029204000300019204010688040101920300020001920301048803980388030101920200010001920201018803980188019804d304880201019201000100019201010188019804d3019805d301570388010101920100019202010188019804d3019805d30357018802010192019201010288019804d3019805d303570188015701010192019201010288019805d3010f03d30557018801010192019201010288010f019803d3020f0122075701880101019201920201090f07570201019201000192010101880222030f085702880101019201000100019202010188010f0122010f0122018801570188025701880157028802010192010002000192020102880157018802b8018802b80388020101920200030001920201048803b80388020101920300040001920301068803010192040006000192080101920600" + }, { "filename": "40-fukuoka-mojiko-heads", "data": "0x00031e14030d0001960d0009000196030001960300019609000600019602000196072701960100019607000600019602000927010001960700060002610b27026106000500046102270106016b010101270106022704610500050001a501e0010601a5032701a501aa01a5032701a501e0010601a50500040009aa015709aa0400050001c1025701c1025701e9035701e9025701c1025701c105000200032701c1015701e001c102e001e903e001e902e001c1015701e001c1032702000100042701c1015701e001c101e0010601e901e0010601e001e901e0010601c10157010601c1042701000100042701c10157010601c1020601e901e0020601e9020601c10157010601c104270100052701c1029c01c1099c01c1029c01c1052701e00106019c01e0010601c1025701c1025701e9035701e9025701c1025701c101e00106019c01e00106052701c1015701e001c10103036f016d036f010301c1015701e001c10527015701e00106015701e001c10157010601c1016d01970146039701460197016d01c10157010601c101e0015701e001060157015702060157010601c10157010601c1010301460197034601970146010301c10157010601c101060157020601570557017f0257017f0103019701460397014601970103017f0257017f0557" }, + { + "filename": "40-fukuoka-motsunabe-heads", + "data": "0x00041d14030900067f0200017f08000700037f0400017f0300027f0100017f04000600017f0200037f0300037f08000700027f0100017f0f001a00090004010462090006000162020101d8018802e1014102e101570362060004000162010101d8038807e1025701d8026204000300016201d8028801570288031b0141031b038802d8016203000100026201d80388025708220288035701d802620100016201000162018801570288025708e10457028801620100016201000262018802570388041b0141031b02570488026201000300016201d80257038807e1048801d801620300030001620101016202d8028803e1014103e1028801d80362030003000162010101620201016201d8042201e1015701d80662030004000101016202010e6204000500016202010d620500" + }, { "filename": "40-fukuoka-tenmangu-heads", "data": "0x00031e14021b0001660100016a170001660200040013080500016a0400020801c4020801c4020801c4020801c4020801c402080500016604000185010801b80d8501b8010801850500026a0200028501b805850398058501b80285030002660129016a0200028501b804850584048501b802850300012901660400028501b80385028403bf0284038501b8028505000200048501b80185038401bf03c401bf0384018501b8048503000200061804bf017701c4017704bf061803000300031804a201bf017703bf017701bf04a2031804000300011801eb011802eb011801eb01bf011803eb011801bf01eb011802eb011801eb011804000300011801b5011802b5011801b501bf011803b5011801bf01b5011802b5011801b5011804000300011801b5011802b5011801b501bf011803b5011801bf01b5011802b5011801b5011804000300071801bf051801bf0718040003000118010d0118020d0118010d01bf0118030d011801bf010d0118020d0118010d011804000200019d026f029d026f029d026f029d026f029d026f019d026f019d03000600016f029d026f029d026f029d026f029d016f0600" @@ -1314,6 +1595,10 @@ "filename": "41-saga-mudskipper-fiddlercrab-heads", "data": "0x0002181502070003610c0005000361028d0c0004000261018d036105000278050004000161018d0361018d0305018d0105017801920105040003000461018d01610105018d0805030003000161018d0161018d0705018d02050292030001000161018d020001610205018d0305018d0305029204000361018d01000c050500018d0161018d01610205018d0305018d020501d7010507000361090506d70400018d0161018d0105018d0205018d0205030004d705000361060501d7040002d70600018d0161018d060501d70c0001000261018d0105018d030502d70b000100018d02610405018d02d70b0002000161018d0205018d030502d70400019201000192020001a10200018d0161018d0305018d030503000149017801000178010002090300018d0161018d03000305018d0300047502090900018d0361018d0200047502000a000161028d0200017501000275010001750100" }, + { + "filename": "41-saga-sicilianrice-heads", + "data": "0x00051b150507000801070005000c01050003000601022202010122050103000200040102dd0222022c022201dd012204010200010004010122022c01dd0122022c02dd022c050101000100030102dd022c012804b801dd022c02dd030101000301052203b8012804b8042202010201022203dd08b803dd012203010301022c022209b80122022c03010301022c012205b8012804b80122022c012202010301012202dd02b8012806b803dd0122030101000301012201dd09b802dd01220301010001000301012201dd022c05b80128022c02220301010002000401022c012201b8022c0222022c01dd03010200030006010122022c0122010101220401030005000401012207010500070008010700" + }, { "filename": "41-saga-yoshinogari-heads", "data": "0x0002181409030001d8010001d8010001d8010001d8010001d80300040007d80400030009c9030002000bd8020001000dc9010002000b99020001000d9901000f99010001bb050001bb050001bb010001de01bb050001bb050001bb01de0fde01de01bb050001bb050001bb01de0fde010001bb050001bb050001bb0100010001bb050001bb050001bb0100010001bb050001bb050001bb010001000dbb0100010001bb050001bb050001bb0100010001bb050001bb050001bb0100" @@ -1330,18 +1615,26 @@ "filename": "42-nagasaki-saseboburger-heads", "data": "0x00071c1504030002c2042b01c2032b01c2012b01c2032b02c20300020014c20200020014c2020002000393031c0593011c0493021c029302000100151c0100011c011c0100031c0e55041c010006000ee0011c0300040007e009e50400020009e5099302e50200010002e502da01010dda010102da01e5010001e503da010101da01010bda010101da010102da0100020014970200020007550585065504000200019301c2015501c2045508c2015502c201930200030012930300" }, + { + "filename": "43-kumamoto-igusa-heads", + "data": "0x00071b140516a201290122012901220129012201290122012901220129012201290122012901220129012201290122012901220129012201290122012901220129012201290122012901220129012201290122012901220129012201290122012201290122012901220129012201290122012901220129012201290122012901220129012201290122012901220129012201290122012901220129012201290122012901220129012201290122012901220129012201290129012201290122012901220129012201290122012901220129012201290122012901220129012201290122012901220129012201290122012901220129012201290122012901220129012201290122012901220129012201220129012201290122012901220129012201290122012901220129012201290122012901220129012201290122012901220129012201290122012901220129012201290122012901220129012201290122012901220129012901220129012201290122012901220129012201290122012901220129012201290122012901220129012201290122012901220129012201290122012901220129012201290122012901220129012201290122012901220122012901220129012201290122012901220129012201290122012901220129012201290122012901220129012201290122012901220129012201290122012901220129012201290122012901220129012201290122012916a2" + }, { "filename": "43-kumamoto-karashirenkon-heads", "data": "0x00051a1505060009c60600040002c609d402c60400020002c606d401c606d402c60200010001c604d401c602d403c602d401c604d401c60100010001c602d404c601d403c601d404c602d401c6010001c604d403c602d401c602d403c604d401c601c605d401c607d401c605d401c601c602d402c60bd402c602d401c601c601d404c604d401c604d404c601d401c601c602d402c60bd402c602d401c601c605d401c607d401c605d401c601c604d403c605d403c604d401c6010001c602d404c605d404c602d401c60100010001c604d401c602d403c602d401c604d401c60100020002c605d402c606d402c60200040002c609d402c60400060009c60600" }, { "filename": "43-kumamoto-kumamotocastle-heads", - "data": "0x00021d15020800019d12000700019d0101019d11000600059d10000600050e1000040002c80206019d020602c80e00040002c8029d0101029d02c80e00030002c8029d0323029d02c80d0003000501019d05010800019d04000300010e0223010e019d0101019d010e0223010e0700019d0101019d0300020001c8036f019d0323019d036f01c8060003060300020001c8020e019d0101030e0101019d020e01c8039d03c8019201230192030002c8019d0c6f02c8039d01c8036f01c802000100019d0101019d0c01026f020101c80192019d019202c8010001000392010e0623010e0223020e029201230192019d0301019d01010100010003920c0e0492052301920100059d0100010101000101010001010100010101fa010101fa0a92010005010159025e0659015e02cf01ef015e030e01cf01ef02cf0100020e0392015e0259015e0159025e0159015e025901ef01cf0159030e01ef02cf01ef01cf020e03920159015e0859015e015901cf025e020e01cf02ef02cf025e01cf01ef01cf015e0159025e0159015e0159025e0259015e0259015e0159010e01ef02cf02ef" + "data": "0x00021d15020800019d12000700019d0101019d11000600059d10000600050e1000040002c80206019d020602c80e00040002c8029d0101029d02c80e00030002c8029d0323029d02c80d0003000501019d05010800019d04000300010e0223010e019d0101019d010e0223010e0700019d0101019d0300020001c8036f019d0323019d036f01c8060003060300020001c8020e019d0101030e0101019d020e01c8039d03c8019201230192030002c8019d0c6f02c8039d01c8036f01c802000100019d0101019d0c01026f020101c80192019d019202c8010001000392010e0623010e0223020e029201230192019d0301019d01010100010003920c0e0492052301920100059d012301010123010101230101012301010123010101230a92010005010159025e0659015e02cf01ef015e030e01cf01ef02cf0100020e0392015e0259015e0159025e0159015e025901ef01cf0159030e01ef02cf01ef01cf020e03920159015e0859015e015901cf025e020e01cf02ef02cf025e01cf01ef01cf015e0159025e0159015e0159025e0259015e0259015e0159010e01ef02cf02ef" }, { "filename": "44-oita-beppujigoku-heads", "data": "0x00021c17030a00027f0100017f0b000800027f0f000700017f0300017f0d000700017f0300017f0200039b0230019b05000700037f0500063004000300029d0500017f0e000200049d0300017f0100027f060001570100015703000200019d01c8019d01c80300017f0300017f0400055702000100069d0300017f0200017f0400056f02000c00017f0500016f0100036f020019000100023e0100023e0500017f070003520300063e030001ee027e01ee017e01ee020002520600033e0105023e020003a701ee02a7030001520100045201230100063e0c0005520238010002c1023e0300010101060f00060001010100010101060f000800010101060101020006bf06000600010101000101010601000106020006bf0500080001010106070001bf010001bf05001900110001bf010001bf0500" }, + { + "filename": "44-oita-shiroshitakarei-heads", + "data": "0x00051c15010c0001cd012b01cd012b01cd012b01cd08000b00012b01cd012b01cd012b01cd012b01cd032b05000a0001cd012b01cd012b01cd0898012b03000900012b01cd012b0d9802000800022b0f98012301000700012b0d9801b80298012302980700012b0a980197029802b8039801cd0600012b08980197069801b8039801000600079801970c9801000400069801970e980200010002cd049801971198020001cd022b01980197139801b80200022b01cd012b1398010001b80200010001cd022b01cd0200049803230798012b05000100022b01cd04000b98022b0600030001cd0500022b059801cd012b01cd012b07000b00012b01cd012b01cd012b01cd012b01cd0800" + }, { "filename": "44-oita-usajingu-heads", "data": "0x00031e1501070001b80d0001b8070007000fb80700060011b80600050013b80500060002bf01b402bf01b402bf01b402bf01b402bf01b402bf0600070001bf01b4020101b4020101b4020101b4020101b401bf0700020006b8016d02bf016d05bf016d02bf016d06b80200020006b801bf020101bf010103bf010101bf020101bf06b80200020006b801bf020101bf010103bf010101bf020101bf06b80200020004b802bf01b402bf01b402bf01b402bf01b402bf01b402bf04b80200010006b801bf01b402bf01b402bf01b402bf01b402bf01b401bf06b80100010007b801bf020101bf020101bf020101bf020101bf07b8010007b80101016d02bf016d05bf016d02bf016d010107b80200010101bf01dd010f01dd010f01bf01dd010f01bf01dd010f01bf01dd010f01bf01dd010f01bf01dd010f01dd010f01bf010102000200010d01bf01dd010f01dd010f01bf01dd010f01bf01dd010f01bf01dd010f01bf01dd010f01bf01dd010f01dd010f01bf010d02000200010101bf01dd010f01dd010f01bf01dd010f01bf01dd010f01bf01dd010f01bf01dd010f01bf01dd010f01dd010f01bf0101020002000101016d0401016d02bf016d01dd010f01bf01dd010f016d02bf016d0401016d0101020001000dbf016d0dbf0100030005bf016d02bf016d05bf016d02bf016d05bf0300" @@ -1354,17 +1647,25 @@ "filename": "45-miyazaki-chickennanban-heads", "data": "0x00061a14040800078707000600038701790787050004000a8701790487030004000287017902870179028701790587029c02000200029c0c87059c01000100029c0c87079c0100029c0187017903870179028701790287089c0100029c0a87099c029c0a870a9c029c08870c9c0100029c018701790287017901870c9c01000100029c05870d9c01000200029c028701790187029c0111099c02000200029c0387049c0311069c020005000e9c0300" }, + { + "filename": "45-miyazaki-karamen-heads", + "data": "0x00041b1505080006bf0800060002bf060102bf0600040002bf0a0102bf0400030001bf04010633040101bf0300020001bf0301043301280533030101bf0200010001bf020103330128013302d00128014101d00433020101bf0100010001bf0101033302d0012801d00141022801d0012801d00333010101bf010001bf0201013301410133012808d002280233020101bf01bf0101023303d0032803d0052801410133010101bf01bf01010233022803d0032803d0012803d00133010101bf01bf01010233012803d00328014107280133010101bf01bf02010133014103280ad00133020101bf010001bf01010333072804d00233010101bf0100010001bf02010133022802d0022802d0012801d002280133020101bf0100020001bf0201013301d001410133012801b8012801b80128014101d00133020101bf0200030001bf0201033301b8012801b8012801b80233020101bf0300040001bf03010633030101bf0400060001bf080101bf0600" + }, { "filename": "46-kagoshima-goromon-heads", "data": "0x00051e1502080001a50b0001a50700070001a50d0001a506000600112105000500022101950121019501210195012101950121019501210195012101950121019502210400040001210195012101950121019501210195012101950121019501210195012101950121019501210195012103000500067f0121019501210195012101950121067f040007000f7f060007000554057f05540600050004210354057f055406000500012101950121019501210195012101950121019501210195012101950121019501210195012104000400022101950121019501210195012101950121019501210195012101950121019501210195022103000500017f018a037f018a027f018a017f018a027f018a0195027f018a017f0400020001d702050dca0195017f019503ca01d7020501d70200010503d701ca035001ca015001ca030001ca059501ca01d7010502d70100010004d7010501ca035001ca015001ca030001ca0150038a015001ca04d70100010002d7020502d701ca025001ca018a01ca030001ca048a01ca02d70205020001d7010504d7010501ca025001ca018a01ca030001ca048a01ca010503d70200" }, + { + "filename": "46-kagoshima-sakurajimaradish-heads", + "data": "0x00021a15060600015c01dd0100015c0a000500025c01dd025c01dd015c0800060001dd0122011b01dd011b025c07000500025c0122011b0122011b012208000600015c0122011b0122011b0122015c070007000122011b0122011b0122080002001001020001001201010014011401140114011401140114010100120101000200090102e70501020003000e010300060008010600090002010900" + }, { "filename": "46-kagoshima-shirokuma-heads", "data": "0x00011914060400030f0c000700010f0271090007000271010101710800020001c00300010104710201020001c00300020002c004010271050101c00300020001c0020101e4060101b7030103000200010102e4030101b7060102b902000100020102e40a0102b9010101000100030102e40201017109010100010102650401017101ba0171020102da0501010102650f0101000100120113010106110101060106017f0f06017f01060106117f0106010001060f7f0106010002000106047f0401057f0106020003000206097f02060300050009060500" }, { "filename": "47-okinawa-goya-chanpuru-heads", - "data": "0x00061915070600018702a2018701a2018706000400018701a20187016d010f018701a2028701a20400030001a20187020f0201020f018703a2030002000287010f01380222010f0122016d01380122010f02870200010002a201010138026d010f012202010138016d0122010f01a20187010001a202870201016d010f02380101010f020102a20287010002a2020f0122010f01010122020f0122010f016d010f012203870287012201380122010f0101016d0122016d0122010f016d0138010f016d018701a2028701220101010f016d013802010122033801010122020f01a20287016d0201022201380201020f026d0101022201a2010001a2010f01220138020f0101026d0222010f01220187010f018701000100018701a2013801220201016d0122010f0201016d01220138018701a2010002000287010f01010438010f0222010f0287020003000287010f0438010f0122010f02a20300040002a20187016d0122010f01a2038704000600028702a202870600" + "data": "0x00051a15060600038703a2028706000400018701a2028701a2078704000300018701a20387026d020f038702a203000200028701a20187020f0201010f0222018701a2038702000100028701a2010f01380222010f0122026d01380122010f048701000100028701a20138026d010f0122010f020101380222010f0387010001a202870101026d010f03380101010f0201030f02a2018701a20287020f02010222020f0122020f0222026d018701a2018701a2018703220101026d0322010f026d020f028701a2028701a20222016d0138036d03380301020f02870287026d0201012201380201016d020f026d01010222028701000287020f0138020f01010422010f0222010f01a20187010001000387013801220201016d0122010f0201016d01220138018701a201870100020002a20187010f01010438010f0222010f028701a2020003000387010f0438010f0122010f028701a203000400038701a2016d020f028701a202870400060001a2048702a201870600" }, { "filename": "47-okinawa-shuricastle-heads", diff --git a/contract/test/image-local-data_test.json b/contract/test/image-local-data_test.json new file mode 100644 index 00000000..32488200 --- /dev/null +++ b/contract/test/image-local-data_test.json @@ -0,0 +1,1502 @@ +{ + "bgcolors": [ + "d5d7e1", + "e1d7d5" + ], + "palette": [ + "", + "ffffff", + "c5b9a1", + "cfc2ab", + "63a0f9", + "807f7e", + "caeff9", + "5648ed", + "5a423f", + "b9185c", + "b87b11", + "fffdf2", + "4b4949", + "343235", + "1f1d29", + "068940", + "867c1d", + "ae3208", + "9f21a0", + "f98f30", + "fe500c", + "d26451", + "fd8b5b", + "5a65fa", + "d22209", + "e9265c", + "c54e38", + "80a72d", + "4bea69", + "34ac80", + "eed811", + "62616d", + "ff638d", + "8bc0c5", + "c4da53", + "000000", + "f3322c", + "ffae1a", + "ffc110", + "505a5c", + "ffef16", + "fff671", + "fff449", + "db8323", + "df2c39", + "f938d8", + "5c25fb", + "2a86fd", + "45faff", + "38dd56", + "ff3a0e", + "d32a09", + "903707", + "6e3206", + "552e05", + "e8705b", + "f38b7c", + "e4a499", + "667af9", + "648df9", + "7cc4f2", + "97f2fb", + "a3efd0", + "87e4d9", + "71bde4", + "ff1a0b", + "f78a18", + "2b83f6", + "d62149", + "834398", + "ffc925", + "d9391f", + "bd2d24", + "ff7216", + "254efb", + "e5e5de", + "00a556", + "c5030e", + "abf131", + "fb4694", + "e7a32c", + "fff0ee", + "009c59", + "0385eb", + "00499c", + "e11833", + "26b1f3", + "fff0be", + "d8dadf", + "d7d3cd", + "1929f4", + "eab118", + "0b5027", + "f9f5cb", + "cfc9b8", + "feb9d5", + "f8d689", + "5d6061", + "76858b", + "757576", + "ff0e0e", + "0adc4d", + "fdf8ff", + "70e890", + "f7913d", + "ff1ad2", + "ff82ad", + "535a15", + "fa6fe2", + "ffe939", + "ab36be", + "adc8cc", + "604666", + "f20422", + "abaaa8", + "4b65f7", + "a19c9a", + "58565c", + "da42cb", + "027c92", + "cec189", + "909b0e", + "74580d", + "027ee6", + "b2958d", + "efad81", + "7d635e", + "eff2fa", + "6f597a", + "d4b7b2", + "d18687", + "cd916d", + "6b3f39", + "4d271b", + "85634f", + "f9f4e6", + "f8ddb0", + "b92b3c", + "d08b11", + "257ced", + "a3baed", + "5fd4fb", + "c16710", + "a28ef4", + "3a085b", + "67b1e3", + "1e3445", + "ffd067", + "962236", + "769ca9", + "5a6b7b", + "7e5243", + "a86f60", + "8f785e", + "cc0595", + "42ffb0", + "d56333", + "b8ced2", + "b91b43", + "f39713", + "e8e8e2", + "ec5b43", + "235476", + "b2a8a5", + "d6c3be", + "49b38b", + "fccf25", + "f59b34", + "375dfc", + "99e6de", + "27a463", + "554543", + "b19e00", + "d4a015", + "9f4b27", + "f9e8dd", + "6b7212", + "9d8e6e", + "4243f8", + "fa5e20", + "f82905", + "555353", + "876f69", + "410d66", + "552d1d", + "f71248", + "fee3f3", + "c16923", + "2b2834", + "0079fc", + "d31e14", + "f83001", + "8dd122", + "fffdf4", + "ffa21e", + "e4afa3", + "fbc311", + "aa940c", + "eedc00", + "fff006", + "9cb4b8", + "a38654", + "ae6c0a", + "2bb26b", + "e2c8c0", + "f89865", + "f86100", + "dcd8d3", + "049d43", + "d0aea9", + "f39d44", + "eeb78c", + "f9f5e9", + "5d3500", + "c3a199", + "aaa6a4", + "caa26a", + "fde7f5", + "fdf008", + "fdcef2", + "f681e6", + "018146", + "d19a54", + "9eb5e1", + "f5fcff", + "3f9323", + "00fcff", + "4a5358", + "fbc800", + "d596a6", + "ffb913", + "e9ba12", + "767c0e", + "f9f6d1", + "d29607", + "f8ce47", + "395ed1", + "ffc5f0", + "cbc1bc", + "d4cfc0" + ], + "images": { + "bodies": [ + { + "filename": "body-bege-bsod-bodies", + "data": "0x0015171f090e020e020e020e02020201000b02020201000b02020201000b02020201000b02020201000b02020201000b02020201000b02" + }, + { + "filename": "body-bege-crt-bodies", + "data": "0x0015171f090e030e030e030e03020301000b03020301000b03020301000b03020301000b03020301000b03020301000b03020301000b03" + }, + { + "filename": "body-blue-sky-bodies", + "data": "0x0015171f090e040e040e040e04020401000b04020401000b04020401000b04020401000b04020401000b04020401000b04020401000b04" + }, + { + "filename": "body-bluegrey-bodies", + "data": "0x0015171f090e050e050e050e05020501000b05020501000b05020501000b05020501000b05020501000b05020501000b05020501000b05" + }, + { + "filename": "body-cold-bodies", + "data": "0x0015171f090e060e060e060e06020601000b06020601000b06020601000b06020601000b06020601000b06020601000b06020601000b06" + }, + { + "filename": "body-computerblue-bodies", + "data": "0x0015171f090e070e070e070e07020701000b07020701000b07020701000b07020701000b07020701000b07020701000b07020701000b07" + }, + { + "filename": "body-darkbrown-bodies", + "data": "0x0015171f090e080e080e080e08020801000b08020801000b08020801000b08020801000b08020801000b08020801000b08020801000b08" + }, + { + "filename": "body-darkpink-bodies", + "data": "0x0015171f090e090e090e090e09020901000b09020901000b09020901000b09020901000b09020901000b09020901000b09020901000b09" + }, + { + "filename": "body-foggrey-bodies", + "data": "0x0015171f090e030e030e030e03020301000b03020301000b03020301000b03020301000b03020301000b03020301000b03020301000b03" + }, + { + "filename": "body-gold-bodies", + "data": "0x0015171f090e0a0e0a0e0a0e0a020a01000b0a020a01000b0a020a01000b0a020a01000b0a020a01000b0a020a01000b0a020a01000b0a" + }, + { + "filename": "body-grayscale-1-bodies", + "data": "0x0015171f090e0b0e0b0e0b0e0b020b01000b0b020b01000b0b020b01000b0b020b01000b0b020b01000b0b020b01000b0b020b01000b0b" + }, + { + "filename": "body-grayscale-7-bodies", + "data": "0x0015171f090e0c0e0c0e0c0e0c020c01000b0c020c01000b0c020c01000b0c020c01000b0c020c01000b0c020c01000b0c020c01000b0c" + }, + { + "filename": "body-grayscale-8-bodies", + "data": "0x0015171f090e0d0e0d0e0d0e0d020d01000b0d020d01000b0d020d01000b0d020d01000b0d020d01000b0d020d01000b0d020d01000b0d" + }, + { + "filename": "body-grayscale-9-bodies", + "data": "0x0015171f090e0e0e0e0e0e0e0e020e01000b0e020e01000b0e020e01000b0e020e01000b0e020e01000b0e020e01000b0e020e01000b0e" + }, + { + "filename": "body-green-bodies", + "data": "0x0015171f090e0f0e0f0e0f0e0f020f01000b0f020f01000b0f020f01000b0f020f01000b0f020f01000b0f020f01000b0f020f01000b0f" + }, + { + "filename": "body-gunk-bodies", + "data": "0x0015171f090e100e100e100e10021001000b10021001000b10021001000b10021001000b10021001000b10021001000b10021001000b10" + }, + { + "filename": "body-hotbrown-bodies", + "data": "0x0015171f090e110e110e110e11021101000b11021101000b11021101000b11021101000b11021101000b11021101000b11021101000b11" + }, + { + "filename": "body-magenta-bodies", + "data": "0x0015171f090e120e120e120e12021201000b12021201000b12021201000b12021201000b12021201000b12021201000b12021201000b12" + }, + { + "filename": "body-orange-yellow-bodies", + "data": "0x0015171f090e130e130e130e13021301000b13021301000b13021301000b13021301000b13021301000b13021301000b13021301000b13" + }, + { + "filename": "body-orange-bodies", + "data": "0x0015171f090e140e140e140e14021401000b14021401000b14021401000b14021401000b14021401000b14021401000b14021401000b14" + }, + { + "filename": "body-peachy-B-bodies", + "data": "0x0015171f090e150e150e150e15021501000b15021501000b15021501000b15021501000b15021501000b15021501000b15021501000b15" + }, + { + "filename": "body-peachy-a-bodies", + "data": "0x0015171f090e160e160e160e16021601000b16021601000b16021601000b16021601000b16021601000b16021601000b16021601000b16" + }, + { + "filename": "body-purple-bodies", + "data": "0x0015171f090e170e170e170e17021701000b17021701000b17021701000b17021701000b17021701000b17021701000b17021701000b17" + }, + { + "filename": "body-red-bodies", + "data": "0x0015171f090e180e180e180e18021801000b18021801000b18021801000b18021801000b18021801000b18021801000b18021801000b18" + }, + { + "filename": "body-redpinkish-bodies", + "data": "0x0015171f090e190e190e190e19021901000b19021901000b19021901000b19021901000b19021901000b19021901000b19021901000b19" + }, + { + "filename": "body-rust-bodies", + "data": "0x0015171f090e1a0e1a0e1a0e1a021a01000b1a021a01000b1a021a01000b1a021a01000b1a021a01000b1a021a01000b1a021a01000b1a" + }, + { + "filename": "body-slimegreen-bodies", + "data": "0x0015171f090e1b0e1b0e1b0e1b021b01000b1b021b01000b1b021b01000b1b021b01000b1b021b01000b1b021b01000b1b021b01000b1b" + }, + { + "filename": "body-teal-light-bodies", + "data": "0x0015171f090e1c0e1c0e1c0e1c021c01000b1c021c01000b1c021c01000b1c021c01000b1c021c01000b1c021c01000b1c021c01000b1c" + }, + { + "filename": "body-teal-bodies", + "data": "0x0015171f090e1d0e1d0e1d0e1d021d01000b1d021d01000b1d021d01000b1d021d01000b1d021d01000b1d021d01000b1d021d01000b1d" + }, + { + "filename": "body-yellow-bodies", + "data": "0x0015171f090e1e0e1e0e1e0e1e021e01000b1e021e01000b1e021e01000b1e021e01000b1e021e01000b1e021e01000b1e021e01000b1e" + } + ], + "accessories": [ + { + "filename": "01-hokkaido-crab-accessories", + "data": "0x0019161c0d0113010001130100011301000113010001130100011301000108011301080100011301000200051302000100011301000313010001130100" + }, + { + "filename": "01-hokkaido-melon-accessories", + "data": "0x0018131a0e014203000142012203420122010003220100" + }, + { + "filename": "01-hokkaido-sheep-accessories", + "data": "0x0018141d0e020001c1010e020003c10300010e0100010e0300040001c1010e020003c101000200010e0100010e0100" + }, + { + "filename": "02-aomori-jade-accessories", + "data": "0x0015141e090400010205000102050001020300010201000500017f0102011c01020101010004000101010001dd0102019b0100017f0700015203000b000b000b000b0002010900" + }, + { + "filename": "02-aomori-squid-accessories", + "data": "0x0018151d0f0300010802000100010102080101010002000208020001010100010801330200010001010123013301000101010101000101010001010100" + }, + { + "filename": "02-aomori-tsugaru-shamisen-accessories", + "data": "0x0018121c0f010001360123012301360123010001360100020b0100020b0100" + }, + { + "filename": "03-iwate-egg-accessories", + "data": "0x0018141b100100020101000101021e01010101021e0101010002010100" + }, + { + "filename": "03-iwate-fujiwara-accessories", + "data": "0x0017141c0f0100012303000200012302000200015d02000100026701cd0100046701310101013101670201" + }, + { + "filename": "04-miyagi-beeftongue-accessories", + "data": "0x0019131a0e013501a1013501a10135018501a1018501a10135" + }, + { + "filename": "04-miyagi-matsushima-accessories", + "data": "0x0016171f0c0600022901010100010104000301012903000b000b00025c0100025c01000129010003a205b106000300015c0100015c01290100025c0100030004b1010002b1010001a20a00020002a2010002290400" + }, + { + "filename": "04-miyagi-zunda-accessories", + "data": "0x0019131b10024e0100034e014e0101014e" + }, + { + "filename": "05-akita-fireworks-accessories", + "data": "0x0015171f0c060001c7010001c70200030001c101c7020001c1010001c10100050001c7010001c7020001c7020001c101c7050001c70100040001c7010001c101c7020001c10100014a030001c7020001c1010001c7014a0100014a01c7030001c703000100014a010001c1010001c7020001c702000400014a010001c1020001c101000300014a0100014a05000400014a0600" + }, + { + "filename": "05-akita-hatahata-accessories", + "data": "0x0018141b0e011005000100015d021001230110011001000101025d01010300015d0200" + }, + { + "filename": "05-akita-raspberry-accessories", + "data": "0x0018141c0e0200024e020001c0014e0100014e02c002b901c0014e02b906b9020002b90200" + }, + { + "filename": "06-yamagata-cherry-accessories", + "data": "0x0018131c0e02c0030001c0010001c0020001c0020001c0010002410100024101e40141010001e40141" + }, + { + "filename": "06-yamagata-lafrance-accessories", + "data": "0x0019131c10010001840100010001840122022201c601de0222" + }, + { + "filename": "06-yamagata-shogi-accessories", + "data": "0x0018131b10010001230100010002230123020001000223" + }, + { + "filename": "07-fukushima-akabeko-accessories", + "data": "0x0019141b0f01230133010101230100013301230133010101330133010001330200" + }, + { + "filename": "07-fukushima-inawashiro-accessories", + "data": "0x0018171e0c030001e0010001a2019504000200029203a202950200039208a20b000b000400010101230500030002010600" + }, + { + "filename": "07-fukushima-train-accessories", + "data": "0x0018131b0f015802570158010e0285010e0485016a0258016a" + }, + { + "filename": "08-ibaraki-bellpepper-accessories", + "data": "0x0018121b0f01dd01e101dd01dd010f01dd01dd010f01dd0100010f0100" + }, + { + "filename": "08-ibaraki-natto-accessories", + "data": "0x001814190e012b0100012b0100012b01000100012b0100012b0100012b" + }, + { + "filename": "08-ibaraki-rokkakudo-accessories", + "data": "0x0017171f09070001860400029107000186060004000161050001860300010001d00100026102000191060001d00200026403000186020001910100018602d401000358080002d4010003d408000a0002910200050002910700" + }, + { + "filename": "09-tochigi-gyoza-accessories", + "data": "0x0018141b0e0100013401000134010001340134012501340125013401250188022501880225010001340100013401000134" + }, + { + "filename": "09-tochigi-lemon-accessories", + "data": "0x0018131c100152020103c701c7015201c7010101c701010352" + }, + { + "filename": "09-tochigi-shimotsukare-accessories", + "data": "0x0019131b0f016001930150014901500187019301600193014901ce0187" + }, + { + "filename": "10-gunma-akagiyama-accessories", + "data": "0x0019171b0c0100014901bf020002bf020001bf014901bf0149011b014901460149011b014901bf011b01460b06" + }, + { + "filename": "10-gunma-tomiokasilkmill-accessories", + "data": "0x001717190902320137033201370332013703320137010102b4010102b40101013701b4010101b4013701010232010003320137033201370332" + }, + { + "filename": "10-gunma-yakimanjyu-accessories", + "data": "0x0017161e0e04000236011101220300023401230101010003000136011101340136010002000134011101230101020001000134013601340101013602000100011101340123013403000100012201360134040001220700" + }, + { + "filename": "11-saitama-icicle-accessories", + "data": "0x0015171c090e0104000101010001010100010101000101010001010100040001e0010001010100010101000101010001010100060001010100010101000101010001e0010006000101010001e001000101030006000101030001e00300060001e0030001e00300060001e00700" + }, + { + "filename": "11-saitama-soka-senbei-accessories", + "data": "0x0018131b0f0100016001e6010002e601110160011103e60100011101e60100" + }, + { + "filename": "12-chiba-inubosaki-accessories", + "data": "0x0018171f0d0128010001280100042802000700010102000700010102000600040f04000154010104b105000254010102b103000354010102b101000354010103b10300" + }, + { + "filename": "12-chiba-orca-accessories", + "data": "0x0018151c0d0100010d0600020d0200010d03000200050d01000300020d020b01000100025601000156010d01000156" + }, + { + "filename": "12-chiba-peanuts-accessories", + "data": "0x0018131b100100016001d8010002600260010001d801600100" + }, + { + "filename": "13-tokyo-tower-accessories", + "data": "0x0016151d0e060001da02000141020001da010002000101030001da02000141020001da010001000301030001000341030001000141010001410300014101000141010001410200" + }, + { + "filename": "13-tokyo-yamanote-accessories", + "data": "0x0018141c0f010001c0010101c00100010103bc010101c003bc01c00101010001bc01000101010001c0010101c00100" + }, + { + "filename": "14-ibaraki-natto-accessories", + "data": "0x001814190e012b0100012b0100012b01000100012b0100012b0100012b" + }, + { + "filename": "14-kanagawa-baybridge-accessories", + "data": "0x0018171e09030001010100015805000101010001580300010101a2015801c8030001a2010101a20158010001a201000101010001a2010001c8010001a201000101010001a201a20200010101a2015801a2010001a2010001a2010101a20158020101000b010300010101000158050001010100015803000101010001580500010101000158" + }, + { + "filename": "14-kanagawa-yacht-accessories", + "data": "0x0018141c100100015402000254014301000254024302000243037f0100" + }, + { + "filename": "15-nigata-edamame-accessories", + "data": "0x0019141b0e0200014e0200014e0100014e01c00100014e01c0011e01c00100011e01c00100" + }, + { + "filename": "15-niigata-riceear-accessories", + "data": "0x0018131d0f02000128010001000128020001c001280100012801c001000128010002c0020002c00200" + }, + { + "filename": "16-toyama-kutabe-accessories", + "data": "0x0019141e030100010e0200030e0a00010e0200020e0201010e0400011803bf0188020e0100020e0201010e0400011801bf020e01bf0100060e0500011804bf0100060e0a000100010e0100010e0100020e0a00" + }, + { + "filename": "16-toyama-shiroebi-accessories", + "data": "0x0018131a0e0400010e010002ba010e01ba01ba0400" + }, + { + "filename": "16-toyama-tateyama-accessories", + "data": "0x0019171c090100017f020001a2017f0300027f01a20100017f027f0100017f01a2027f01a2027f01a2027f01a2017f01a2010001a2027f01a2027f01a2017f02a2017f01a2017f010004a2017f02a2027f02a2" + }, + { + "filename": "17-ishikawa-kotoji-accessories", + "data": "0x0018131c0e02000172020001000372010002000158020001000158010001580100015803000158" + }, + { + "filename": "17-ishikawa-kutani-kaga-gosai-accessories", + "data": "0x0018121a0f0118010f01c401a201e0018001c4010f0118" + }, + { + "filename": "17-ishikawa-oyster-accessories", + "data": "0x0017151c0e030001a0026b01a002000301016b01a0010001a0040101a001000401015d010001a00201015d01990200019901c301990400" + }, + { + "filename": "18-fukui-echizen-crab-accessories", + "data": "0x0019161c0d01140100011401000114010001140100011401000114010001080114010801000114010001a6010001b80414020001000114010001b80214010001b80100" + }, + { + "filename": "18-fukui-heshiko-accessories", + "data": "0x0019131a0f018303e3029c0185019c" + }, + { + "filename": "18-fukui-yokan-accessories", + "data": "0x0018131b0e02000385020003850200038502570385" + }, + { + "filename": "19-yamanashi-fuji-accessories", + "data": "0x0017171e0c0600020b03000500020b01eb010b0200030007eb01000beb0b58010007580300020001e0015802e00500030002e0030002a90100" + }, + { + "filename": "19-yamanashi-grape-accessories", + "data": "0x0018121b0e0200019a01220100019a0112019a019a0112016e01120112016e01450100" + }, + { + "filename": "20-nagano-kappa-accessories", + "data": "0x0018131a0e020f0201010f0100013e0123013e01000100023e022a" + }, + { + "filename": "20-nagano-oyaki-accessories", + "data": "0x0018121b0e01b0011b02000157011b01b0011b0157028a0157010002570100" + }, + { + "filename": "21-gifu-gero-accessories", + "data": "0x0018141c0e020001010100010101000100010101000101020001c8013d0101013d010101c801c8043d01c8010004c80100" + }, + { + "filename": "21-gifu-gohei-mochi-accessories", + "data": "0x0019141b0d020004110100020101600111011a0111010102000260021a0100" + }, + { + "filename": "21-gifu-sarubobo-accessories", + "data": "0x0018131d0f010002230100012302440123017102440171010002230100010002230100017102000171" + }, + { + "filename": "21-gifu-ukaibody-accessories", + "data": "0x0015171f090592075402920592075402920592075402920592075402920292010002920754029202920100029207540292029201000bad0292010001ad012601ad012601ad012601ad012601ad012601ad02920100012601ad012601ad012601ad012601ad012601ad012602920100012601ad012601ad012601ad012601ad012601ad012602920100012601ad012601ad012601ad012601ad012601ad0126" + }, + { + "filename": "22-shizuoka-fuji-accessories", + "data": "0x0017171d0c090002e0020003e0020001010300060002320101020003e0020005320100040001e10632020001dd04e1043204dd07e1" + }, + { + "filename": "23-aichi-misodengaku-accessories", + "data": "0x0019141c0e03350157020001570235015702600335016302000163023501630260" + }, + { + "filename": "23-aichi-oguratoast-accessories", + "data": "0x0018131c0e0293028401930193028401b80193019301b8028401930193018401b8018401930593" + }, + { + "filename": "23-aichi-tebasaki-accessories", + "data": "0x0017131a0e010001480300014804000548010003480100" + }, + { + "filename": "24-mie-iseebi-accessories", + "data": "0x0017151e0d02000132020001320200010001320100023201000132010001000132010002320100013201000132021802320218013201320100011802b40118010001320100011801000232010001180100030002b40300020001180132011801320200" + }, + { + "filename": "24-mie-mochi-accessories", + "data": "0x0019121a0f018401b80184018401b80184" + }, + { + "filename": "25-shiga-funazushi-accessories", + "data": "0x0018151a0e01420100013701000137020001420100014201000137010001370142010001420100014201000142" + }, + { + "filename": "25-shiga-hieizan-accessories", + "data": "0x0018171b090700020f05000500070f0200020f01000b0f028d01000b8d" + }, + { + "filename": "26-kyoto-daimonji-accessories", + "data": "0x0017161d0d0300011405000200011401490114040003140149031402000749020002000114014901140400021401490100014904140249030003490100" + }, + { + "filename": "26-kyoto-yatsuhashi-accessories", + "data": "0x0018131a0e02000157020001000157018601570100015702860257" + }, + { + "filename": "27-osaka-cheesecake-accessories", + "data": "0x0018151c0e01000185032b018501000185012b0185012b0185012b01850157052b015707570100015701b7015701b701570100" + }, + { + "filename": "27-osaka-jinbezame-accessories", + "data": "0x0018161c0d010001a2020001a20400010601a2010002a20400020001a2010602a20106020002a2012302a20106012302a202000206025f01060200" + }, + { + "filename": "27-osaka-owarai-accessories", + "data": "0x0017141c0e0100013301000133020001000533013301000133010001330100010005330300013302000100023301000233" + }, + { + "filename": "28-hyogo-akashiyaki-accessories", + "data": "0x0019141b0f02000260010001000160015d016001ae015d016002ae0160" + }, + { + "filename": "28-hyogo-jst-meridian-accessories", + "data": "0x0017161c0d0132080001320800013202000132050002000232010002320100013201000232020001320300040002320300" + }, + { + "filename": "28-hyogo-tower-museum-accessories", + "data": "0x0017171e0c020001010800020001490200013f0500020001c20200026f0100013e0200020001490100013e016f023e0300020001490100043e030002a201cd01a2013f01a2023f03a2010001a201cd0100013f0200013f010001a2010001a201cd0100013f01a20100013f010001a20200" + }, + { + "filename": "29-nara-kakinohasushi-accessories", + "data": "0x0019141c0f010001c0011b01c0011b0100011b02c0011b019501a2019501a2010002cc019701cc0100" + }, + { + "filename": "29-nara-narazuke-accessories", + "data": "0x0019121a0f03b801b8010001b8" + }, + { + "filename": "30-wakayama-meharizushi-accessories", + "data": "0x0018141c0e010004e1010002e1030101e102c00101021b010102e1030101e1010002e101c001e10100" + }, + { + "filename": "30-wakayama-mikan-kaki-accessories", + "data": "0x0018121a0f03c201c201e101c203c2" + }, + { + "filename": "30-wakayama-nankoume-accessories", + "data": "0x001a151b0d024e010002a60100029c024e010002a60100029c" + }, + { + "filename": "31-tottori-dummy-accessories", + "data": "0x001a151b0d024e010002a60100029c024e010002a60100029c" + }, + { + "filename": "32-shimane-dummy-accessories", + "data": "0x001a151b0d024e010002a60100029c024e010002a60100029c" + }, + { + "filename": "33-oakayama-mamakari-accessories", + "data": "0x0019151b0e01a2019d01a2019d01a201000157019d01a2019d01a2019d01060100050601000157" + }, + { + "filename": "33-okauama-muscat-accessories", + "data": "0x0018141c0f0200014e010001ac0100014e01c0014e0100014e01c0014e01c0014e01c0014e01c0014e0100010001c0014e0200" + }, + { + "filename": "33-okayama-denim-jacket01-accessories", + "data": "0x0015171f090354049201000492025404540392010103920354055401920354019204540e540754010106540a54019201010192015402540100075403920154025401000454010102540392015402540100085401920254025401000b5402540100045401010654" + }, + { + "filename": "33-okayama-denim-jacket02-accessories", + "data": "0x0015171f0903540392040003920154045402920400029202540554019204000192035406540400045405540101040004540654040001540192010101920254010003540400015403920254010002540101040001540392025401000354040002540192015402540100035404000454025401000254010104000454" + }, + { + "filename": "33-okayama-denim-jacket03-accessories", + "data": "0x0015171f09035302540700025403530254070002540453025405000254015306530500035306530500010102530653050003530253010003530500010102530253010003530500035302530c0002530c0002530c00" + }, + { + "filename": "33-okayama-kibidango-accessories", + "data": "0x0018131b0f010002570100015703eb04eb010002eb0100" + }, + { + "filename": "33-okayama-momotaro-accessories", + "data": "0x0015171f080100054d010105040101024d0100054d010105040101024d01000204034d010105040101024d01000204034d010105040101024d010002040100024d010105040101024d010002040100024d010105040101024d01000204010001eb014d010105740101024d01eb020401eb010a01eb010105740101024d01eb020402eb014d010105540101024d01eb020402eb014d010105540101024d01eb020402eb014d010105540101024d" + }, + { + "filename": "33-okayama-peach02-accessories", + "data": "0x0018151c0e0300015f03000200035f02000100055f0100011d025f01e5025f011d0100011d015f01e5015f011d0100" + }, + { + "filename": "33-okayama-retainer-accessories", + "data": "0x0015171f09054d010105040101024d054d010105040101024d0204034d010105040101024d0204034d010105040101024d02040100024d010105040101024d02040100024d010105040101024d02040100024d010105740101024d02040100024d010105740101024d02040100024d010105540101024d02040100024d010105540101024d02040100024d010105540101024d" + }, + { + "filename": "34-hiroshima-battleship-accessories", + "data": "0x0019171f09060001d70700030001d7010002d7070001d7020004d7010001d7010001d7020001d702d701000ad70100024801000b4802a201000ba202a201000ba2" + }, + { + "filename": "34-hiroshima-lemon-accessories", + "data": "0x0019131c0f0100022901220429042903290100" + }, + { + "filename": "34-hiroshima-oyster-accessories", + "data": "0x0018131c0e020001d901060101010001060288010101e9038801010106020c0101010003010200" + }, + { + "filename": "34-hiroshima-rice-scoop-accessories", + "data": "0x0018131c10036003600360010001600100010001600100" + }, + { + "filename": "34-hiroshima-shrine-accessories", + "data": "0x0018171f09040008770200050006bf0300060001bf020001bf0400050006bf0300060001bf020001bf0400027b0100037b01bf027b01bf047b028d01000b8d020601000b06" + }, + { + "filename": "34-hiroshima-wani-accessories", + "data": "0x0017141d0d04560300015602000156030003000156030001000256040003000456070003000456" + }, + { + "filename": "35-yamaguchi-kintaikyo-accessories", + "data": "0x001b171f09010001ca020002ca010002ca010002ca010001ca01ca020001ca020001ca020001ca020001ca01000188013f01000188023f0188023f0188023f0188013f023f01000b3f023f01000b3f" + }, + { + "filename": "35-yamaguchi-motonosumiinari-accessories", + "data": "0x0017171f090e53055303ad03880253010f01e101bf0100025302ad028801bf0288020f02e1010003530288011b01bf011b030f02e1010001bf0253021b020f01bf030f02e1010001e101bf021b040f01bf021b02e1010002e101bf040f01bf031b02e1010003e104bf041b02e1010006e1051b" + }, + { + "filename": "35-yamaguchi-white -snake-accessories", + "data": "0x0017151e0e060001bf0400020101000200010101af02010100010001010500010001af030102000500010101000201030001af0100020001af02010200" + }, + { + "filename": "35-yamaguhchi-tsunoshima-big-bridge-accessories", + "data": "0x0015171f090e3c0e3c041b02e101e0071b035603e1015601e0065602560100045601e0065602560100045601e0065602560100045601e0065601e101560100045601e0065602e10100045601e0065602e1010001e1035601e0065602e1010003e103c8051b" + }, + { + "filename": "36-tokushima-awaodori-accessories", + "data": "0x0018131b0f0220015a01010100022301000100025f01000100025f0100" + }, + { + "filename": "36-tokushima-citrus-sudachi-accessories", + "data": "0x0018131c0e0100035c0100015c010101c70101015c015c01c7010101c7015c015c010101c70101015c0100035c0100" + }, + { + "filename": "36-tokushima-narutomaki-accessories", + "data": "0x0017141c0d02000301020001000101034f010101000101014f0301014f01010101014f0101014f0101014f01010101034f0101014f0101010005010100" + }, + { + "filename": "37-kagawa-oliveoil-accessories", + "data": "0x0017121c0f010001ac01000100015c0100035c015c01c6015c015c01c6015c035c" + }, + { + "filename": "38-ehime-dango-accessories", + "data": "0x0018131c0e0300021b020002a6011b0100027001a60100010001570170020001570400" + }, + { + "filename": "38-ehime-juice-accessories", + "data": "0x0018131f0c02000106018d01060200010602000140030001060140040601010106010003060100010606000142060001420600014206000142" + }, + { + "filename": "38-ehime-mandarin-orange-accessories", + "data": "0x0019121a0f014201e101420342" + }, + { + "filename": "38-ehime-turt-accessories", + "data": "0x0018141c0e0100045701000157037002570157017001570270015701570270015701700157010004570100" + }, + { + "filename": "39-kochi-seared-bonito-accessories", + "data": "0x0019131b0f0378010001780294017801780394" + }, + { + "filename": "40-fukuoka-mentaiko-accessories", + "data": "0x0019171b0902bf0100016a02bf0100026a01bf0100016a01bf016a026a0100036a0100016a01bf016a0100036a02bf0100026a01bf0100036a0100026a01bf" + }, + { + "filename": "40-fukuoka-umegaeda-accessories", + "data": "0x0018131c0e010003c1010002c1019702c101c1019701c1019701c101c1029702c1010003c10100" + }, + { + "filename": "41-saga-saga-accessories", + "data": "0x0017151d0e010002560200015601000100015602000156010001560256020001560100015607000156040001560100015601000156010001560100015603560100015601000156" + }, + { + "filename": "41-saga-yobuko-squid-accessories", + "data": "0x0017131c0e020001510200010003510100010003510100055101000123015101230100025101000251" + }, + { + "filename": "42-nagasaki-castella-accessories", + "data": "0x0018131b0f04ae0428042804ae" + }, + { + "filename": "42-nagasaki-gunkanto-accessories", + "data": "0x0016171f09020001010b000e00010001010c00050002620200016204000400036201000262040001000162010008620300026201000862010001620100026201000b620a000254010001540100015402000254010001540600" + }, + { + "filename": "42-nagasaki-milkshake-accessories", + "data": "0x0018121d0f014d02000157017101570357037f0100017f0100037f" + }, + { + "filename": "43-kumamoto-hitomojiguruguru-accessories", + "data": "0x001913190e014e01e101c001e1014e" + }, + { + "filename": "43-kumamoto-ikinaridango-accessories", + "data": "0x0018131b0e01000351010001d401b8028401d401d40129012a012901d4010003d40100" + }, + { + "filename": "44-oita-toriten-accessories", + "data": "0x0019121b0f01000293039301930200" + }, + { + "filename": "44-oita-yaseuma-accessories", + "data": "0x0018121a0e026002880288026002600288" + }, + { + "filename": "45-miyazaki-mango-accessories", + "data": "0x0018131a0e0100014601e601460100014601e6014601e601460100014601e601460100" + }, + { + "filename": "45-miyazaki-takachihokyo-accessories", + "data": "0x0017141c0d020601e1013d03e10127010501060105013d02e10127010501270106013d02e10127010501270106010101050127012701050201013d010501270127053d0127" + }, + { + "filename": "46-kagoshima-senganen-accessories", + "data": "0x0016171f0907000201050005000101019d0500020103000461070001000161010006610500016101dd010008dd016101dd0161027b01000b7b029501000595067b016a010f0100010f0158036a0495027b02580100020f046a035f0295025801000158030f016a010f035f0258" + }, + { + "filename": "46-kagoshima-shochu-accessories", + "data": "0x0017121c0f0100012301000100013401000334017f01b7017f01b7027f0334" + }, + { + "filename": "47-okinawa-fish-accessories", + "data": "0x0017171d0d012401000224060001000224010001240500012401000224010001280100022801000600022801000128019b0100029b010001280100022801000100029b0100019b0500019b0100029b0600" + }, + { + "filename": "47-okinawa-satokibi-accessories", + "data": "0x0018161c0d0100011e010001c00100011e0100011e0100010001c00100011e010001c00100011e01c001c0011e010001c00100011e010001c00100010001c0010001c0010001c00100011e01000100011e0100011e0100011e0100011e0100" + }, + { + "filename": "47-okinawa-sukugarasu-accessories", + "data": "0x0018141d0e0200020102000100040101000101010e02b101ef01010101039d0201010004010100020002010200" + } + ], + "heads": [ + { + "filename": "01-hokkaido-goryokaku-heads", + "data": "0x00021b16040b0002540a000a00045409000900025401c001dd025408000800025401c001dd01c001dd025407000700035401dd02c001dd0254018706000500035402c001dd03c001dd0187035404000300035401c0015401c002dd03c0018702dd045402000100035401c002dd01c001dd04c0018703c002dd04540100025401c001dd02c001dd01c0019202c0018706c002dd02540200025401c001dd02c0019202c0018707c001dd025401000300025401c001dd02c00287029204c002dd01c00254010003000187015402c001dd03c0029203c001dd02c0025402000200015402870154018701dd08c001dd01c0025403000100015401dd01c0028701c001dd07c001dd01c002540400015401c001dd01c00187025401c001dd06c001dd01c0025404000100025401c0025401c001dd02c004dd02c001dd01c0015404000300035401c001dd01c001dd04c001dd01c001dd01c0025403000400025401c002dd01c0045401c002dd01c0025403000400025401dd02c0065402c001dd025403000500055404000554040005000354080003540400" + }, + { + "filename": "01-hokkaido-ishikari-heads", + "data": "0x00031c15040400067f0200017f0b000200037f0400017f0300027f0100017f07000100017f0200037f0200010d037f02e1010003a201e004000200027f0100017f020d06e103a203e004000400020d015702e101a2019501a201e103a2010d02e0019504000300020d015702a2019501ce029704a204e0010d03000200020d019501a201ce029703ce03a205e0020d02000100020d015704ce01cd02ce01cd02a206e00157020d01000100010d0101019501a207ce060101e0014e0257010d0100010e010d010109ce0757034e010d010e010e010d01221057034e010d010e010e010d03010e570149024e010d010e0100010d03010e570249014e010d01000100010d01220101015701490d570149014e020d01000200020d034901570434025705010157020d02000300020d01490157023401af033405010157020d03000400030d033402af01340501020d04000600020d05340257030d060009000334030d0900" + }, + { + "filename": "01-hokkaido-tokeidai-heads", + "data": "0x00011b14060a00010b0a00090002a101370900070002a1013701e9013701a10137070007000237030102370700080001e901010196010101e908000800015d01960201015d0800080002e9013702e90800080001a10137010b01a101370800013702a1023703a1020b015d020b023701a1033702a102a1013702a10237010b01e903ca01e9010b01a1023702a10237023702a10137010b095d010b013701a1013702a1013701a10237010b0be9010b013702a10137040b0d5d040b010001e9016f03e9016f03e9016f03e9016f03e9016f01e901000100015d016f035d016f035d010b035d016f035d016f015d01000100080b013701a10137080b01000100035d010b035d02a10337035d010b035d0100010001e9016f01e9010b01e9016f02e9030b02e9016f01e9010b01e9016f01e901000100015d016f015d010b015d016f025d0396025d016f015d010b015d016f015d0100010003e9010b04e9030b04e9010b03e90100" + }, + { + "filename": "02-aomori-apple-heads", + "data": "0x00051915080800011b080004000455011b045504000200045502a6011b02a60455020001000655011e011b011e025501010355010001000a5501010455010011551155115511551155115511550100025501a60c55010001000f5501000200065502a60555020003000b550300050007550500" + }, + { + "filename": "02-aomori-dogu-heads", + "data": "0x00021814080400080a04000400020a0236010a0236010a040004000136030a01ca020a013604000600020a0136010a06000500010a04ca010a05000500030a01ca020a0500010001ca010a01ca010a01ca040a01ca010a01ca010a01ca0100060a01ca010a01ca020a01ca040a01ca010a01ca010a01ca018a040a01ca018a010a01ca010a01ca060a01ca010a01ca070a01ca090a01ca040a01ca0100010a01ca010a01ca010a01ca010a01ca020a01ca010a01ca010a01000500010a01ca030a01ca0500050001ca020a018a010a01ca05000500010a01ca010a01ca020a0500050006ca05000500060a0500050001ca040a01ca05000600010a02ca010a0600" + }, + { + "filename": "02-aomori-goldfish-nebuta-heads", + "data": "0x000119170409000333090008000533080007000233010101330101023307000700033301010333070005000b3305000400053301010133010105330400030002330101043301010433010102330300030003330101033303bf01330101033303000300053307bf033303000100053303bf010103bf010103bf0333010005330dbf03330233010101330fbf0233033301010fbf023301000233022301010bbf0101022301000200013302230dbf02230100040001230dbf01230200040001bf012304bf032304bf012301bf020005000123030101bf010d01b4010d01bf03010123030006000301010d0301010d030104000200010101000201010001330301012303010133010002010100010103000101010001010100013302000123010101230200013301000101010001010100030002010d0002010100050001010b0001010300" + }, + { + "filename": "03-iwate-moriokamen-heads", + "data": "0x00031d15040b00012303bf0a000900012302bf020103bf08000900012301bf010105bf08000800012303bf03a003bf07000800012302bf04a003bf07000800012302bf05a002bf07000900012302bf02a003bf0800040001060401010006bf010004330400020001060201034701930201010003bf02330401023302000100010601010193054702930101020001330401015703010133010001000106010101930347012901930129019301010200013302010257012201dd015701010133010001060101043704290293010101330201015701dd012201b80122015702010133010601010337062901220101013301010257012201b8018501b80257010101330106010102370101011e04290222010101330101025701b8018501b80185012201570101013301060101013701930201042902220101013301010257012201b80185012201dd0157010101330100010601010193052902930101020001330201015701dd0122025701010133010001000106010102930397019303dd0200013303010257030101330100020001060201019302970193020104000233040102330200030002060401080004330400" + }, + { + "filename": "03-iwate-nanbutekki-heads", + "data": "0x00031b14060700050e09000400030e0500030e06000300010e0b00010e05000200010e0d00010e04000200010e0d00010e04000200010e0600010e0600010e04000300010e0100090e0100010e050003000d0e050002000f0e04000100110e03000100110e0100020e150e140e0100140e01000100130e01000100050e0163010e0163010e0163010e0163060e020002000f0e040003000d0e0500" + }, + { + "filename": "04-miyagi-datemasamune-heads", + "data": "0x00011d150517000128150002280100120002010128030008000192010e0192010e0192010e032801010600032803000192010e0192010e019201010328010e080003000528030103280192010e019207000100020e01000192010e0192020103280192010e0192010e0192010e0100020e03000100010e0100010e0192010e0b92020e0100010e03000200020e0292030e0192010e0192010e0192030e0192020e04000200030e0192020e0192020e0192020e0192020e0192020e04000300010e01920188010e0192030e0192030e0192020e019205000300010e01920c880192010e05000300010e01540c880154010e05000300012801540c8801540128050002000128010e01540788016004880154010e012804000200020e01540788016004880154020e040001000128020e01540788016004880154020e012803000100030e01540588026004880154040e03000200030e01540388042303880154030e04000400020e025406880254020e0600080006540a00" + }, + { + "filename": "04-miyagi-hoya-heads", + "data": "0x0004191407050001710194017102000371050005000394020003940500050001710194017102000371050004000a71040002000e71020002000e710200010010710100010010710100127112711271127112711271010006e405ae05e40100010010e4010002000ee40200" + }, + { + "filename": "04-miyagi-tanabata-heads", + "data": "0x00041c160406000de1010001bf0300050001e1010001010400010104000101010002e1010001560100040001e1020001010400010104000101020001c701e10200030001e102000356020003bf020003c7030001bf0100020001e10200015601bf015601bf015601bf01c701bf01c701bf01c7015601c7015601c701000101010001c7020001e10200055605bf05c7020001560100010001e10300055605bf05c70400010001e104000356020003bf020003c7050001e10400050605ba05e9040001e10400050605ba05e9040001e10400050605ba05e9040001e105000356020003bf020003c7050001e105000356020001bf01c701bf020003c7050001e1050001bf015601bf020003bf020001c7015601c7050001e10500015601bf0156020001bf01c701bf0200015601c70156050001e10500015601bf0156020001c701bf01c7020001c7015601c7050001e1050001bf015601bf020001bf01c701bf020001c7015601c7050001e10500015601bf0156020003bf0200015601c70156050001e10500015601000156020001c7010001c7020001c7010001c70500" + }, + { + "filename": "05-akita-akitainu-heads", + "data": "0x00031a14021100012b06001000022b010105001000032b020103000f00042b01010123020101800e00042b06010c00062b0301025f01000b00072b0501015f0a00092b0201030009000b2b010103000200040103000b2b0101030001000201032b010101000b2b0201030002010d2b0101032b010104000201022b0200082b0301022b010104000201032b0100072b020101000101022b050002010b2b020101000101022b050001000201032b0101052b020102000101022b05000200040101000101042b010103000201012b05000800032b0301030003010400" + }, + { + "filename": "05-akita-magewappa-heads", + "data": "0x00041a15040200108e0400010012de0300148e020014de02000188128e0188020001de0188018e02de018e04de018e03de018e02de018e018801de0200010001de0788016001880184068801de0300020007de01d801de018406de04001600030012c90100020014c90200018812c90188020001de0888016001880184078801de0200018808de01d809de0188020001de0888016001880184078801de0200018808de01d809de018803000888016001880184078801000400018e01de018e02de018e04de018e02de018e01de018e0200" + }, + { + "filename": "05-akita-namahage-heads", + "data": "0x00021a16040700014109000141040007000241070002410400080002410500024105000600062301000523040005000123060e0123050e0123030004000123010e0623010e0523010e0123020003000123010e0123010e0123040e0123040e0223010e0123010003000123010e0123010e022307410323010e0123010003000123010e0123010e014103230318032301410123010e0123010003000123010e0123010e034102230141022303410123010e0123010002000123010e0123010e01410201022301010141010102230201010e0123010e012302000123010e0123010e01410201022301010141010102230201010e0123010e012302000123010e0123010e011801410401014104010141010e0123010e012302000123010e0123010e0118034101180341011802410118010e0123010e012302000123010e0123010e01410318054102180141010e0123010e012301000123010e0123010e01230141012302410218014102180141012301410123010e0123010001000123010e0123010e0123014101230101012301cf012301cf012301cf0101012301410123010e0123010001000123010e0123010e01230118020101cf012301cf012301cf0123020101180123010e0123010001000123010e0123010e012301410101012301cf041801cf0123010101410123010e0123010001000123010e0123010e012301000141021804410218014101000123010e01230100012301000123010001230c000123010001230200" + }, + { + "filename": "06-yamagata-hanagasa-heads", + "data": "0x00021b170508000641080006000241065702410600040002410a5702410400030001410a5701320141025701410300020001410157013201410132025701c603570132024101320257014102000200014101570441025701dd025703410132014101570141020001000141015701320341025701dd045701410132014103570141010001000141025701410132035702dd015701dd035701c60357014101000141065701dd015704dd085701410141035701c6035702dd0341085701410141075701dd024101320241035701410132025701410141035701410357024101320141013201410257044101570141014102570132024102570332024101320141015702410132014101570141014102570141013201410132025702410232014102570132024101320157014101000141015701320241013203570341015701280257023201570141010001000141025701410132075701280123012804570141010002000141035701c6075701280123012802570141020002000141065701320341013201570128012301280157014102000300014105570141013201410132035701280157014103000400024104570141013204570241040006000241065702410600080006410800" + }, + { + "filename": "06-yamagata-imoni-heads", + "data": "0x00041b14050800060d08000600020d0600020d06000400020d0a00020d04000300010d0e00010d03000200010d0400080e0400010d02000200010d0200020e028501880103028501970185020e0200010d02000100010d0100020e0185021b01970303029702030185020e0100010d01000100010d010e0185030302970203019702e102030385010e010d01000100010d02850288021b0188020b021b0285020b021b0185010d0100010e010d01970203020b030301850397020302e101880185010d010e020e01970203019701030188020303e10103028802970203020e010e038502e10103018802e1028801850203039701030285010e0100020e01e102970285020301880497020b0285020e01000100040e029702e1020301850297021b0185040e01000200050e0285016201bc016201bc01620185050e02000300100e030005000c0e0500" + }, + { + "filename": "06-yamagata-zaookama-heads", + "data": "0x00041d14040a00072702010227040007000b2703010127030005000e27024c0101012702000400022701010c2704010127010003000127020103270a010127024c0101012701000200020102270301073004010127030101270100010102270201019b0b3002010127024c01010127022703010e30020101270101022702010235103001010127010102270235123001010127010102270201019b113001010127010102270101014c010111300301012701000101014c02010f3003010127020001000201014c01010e3003010127020002000101014c03010a300201014c01010127030003000201014c0b01014c0101014c0101040005000401014c0101014c0101014c0301014c01010600" + }, + { + "filename": "07-fukushima-peach-heads", + "data": "0x00041d16040500020f12000300030f0197010f0100030f0d000100060f0297030f0100020f0a000100030f05b90297030f0197010f09000100020f04b9011902b9020f0297030f0100020f05000100020f04b9011903b9040f0197010f0100030f04000100010f05b9011903b90a0f0100010f0200020f04b9011904b9060f0297050f0100020f04b9011903b9080f0197010f0197030f0100030f02b9011904b9040f06b9010f0297020f040f05b9040f05b9011902b9040f0d0f05b9011902b9040f01000b0f06b9011903b9030f0100020f0100080f06b9011903b90100020f0400010f0100020f0100030f06b9011903b90100010f01000600020f0100050f03b9021903b903000a00030f04b9011903b904000a00010f020003b9011904b90400100003b90600" + }, + { + "filename": "07-fukushima-takizakura-heads", + "data": "0x00021e14021200035f07001000045f01db025f05000c00035f01db035f01b8045f04000a00045f01db045f01b8025f01db015f0100025f01000600025f0200035f01b801db025f0100015f01b8025f01db0100015f02b8015f0500025f01b8015f0200015f010001b8035f0100025f01b8010001db01b8015f01db025f0200055f01b8025f0200015f010001b80400015f04b8015f01db015f01db0100015f01db01b8025f01b8015f01db095f020003b8025f0100015f01db0100015f01db025f02b8025f01b8025f0100035f01b8015f04b80100015f04000300035f01b8025f01b8025f0200035f05b806000100025f0200015f01b80100055f0100015f0100015f03b80100015f01b8045f0100015f01b8035f020001b8015f01db015f01b8015f040003b80100025f01db02b8025f025f02b8015f0100025f010001db020003b8010003b80200025f01db045f01db035f01b8025f01b8015f040006b80300015f01db0100015f01db015f01db0100015f02b8015f010001b8015f050005b8025f0100015f0200015f01db01000200035f02b8045f020005b8065f04000200015f0100035f01db01b8025f06b80100025f01db035f01db03000400025f010001db0200015f010005b80100015f010001db015f0100015f01db03000500015f050005b8040001db0200015f0400" + }, + { + "filename": "07-fukushima-tsurugacastle-heads", + "data": "0x00011a140309000162050001620700080001620700016206000900078907000900078907000800098906000900020103080201070007000b89050006000d89040007000201017f0108010101890101017f0108020105000600068901010689040005000689010101a301010689030006000101017f010107890101017f01010400050005890201017f0201058903000300019406890501068901940100020002940101027f0201027f0301027f0201027f01010294020001870c8901010689018702000c890301068902000301027f0201027f0101018905010189027f02010d89050105891701" + }, + { + "filename": "08-ibaraki-anglerfish-heads", + "data": "0x00031e14010700059811000400027e0a980d000300047e0b980b000200047e03000a980a000200037e06000a9808000300017e06000c98070008000f9806000600129805000500149804000400159804000100037e1598037e0100047e1598047e047e1598047e0100027e010015980100027e0100050005980a3905980400050003980e39029805000600019810390198050008000e980700" + }, + { + "filename": "08-ibaraki-hananuki-ravine-heads", + "data": "0x00041c1502040001c006000136019701c601d80197013602bf0700020001c0060001bf01000136019701d801bf01970136060001bf0200060001bf010001bf0100029704d802970800040002c604000136019701d8019702d801970136020002bf0400070001c601000197013601d80188019701bf018801d8013601bf030001c0030009000136019702d8029702d801970136010001c0020002c00100010002c0020001c0010001bf01000136019701bf018802970288019701360700030001c0010002bf01000197013603d8029703d8013601970600080002970388029703880297020001c6010001bf010007000136029703d8029702d801bf019702c6030002c6010001bf05000136019702bf02d8019701c604d801970136010001bf0300010002bf040001360197028801bf01880297028802bf01970136050004bf0200029702bf03d8029702d801bf02d802970400010002bf02000136029705d8029705d802970136030005000136019701d802bf02d802bf019701d802bf03d801c60136010001bf01000400019701360197038802bf0188019702bf048801c60197013602bf0100040001970136019706d8029706d8019704bf170002bf0100" + }, + { + "filename": "08-ibaraki-rocket-heads", + "data": "0x00041917030f0007010e000201015505010d0001260101015506010c000226015507010b00052606010a00072605010700037f082604010600047f0a26010101000500057f0b2601000400057f0b2602000300057f0b26030002000155047f0b260400024201000155027f020109260500040001550100030107260600030001420100020d0301032601290126017f060002000142010001730100020d03010326017f0700050001420100010d0100027f0201017f08000600017301000155027f0101017f0900030001730200024201000155027f0a000a0001550b00" + }, + { + "filename": "09-tochigi-sanzaru-heads", + "data": "0x00041e1401050003340500043404000434040003000634030006340200063403000300023401af013401af02340100023401af013401af063401af013401af013403000200013401b805af033405af043405af013402000200013401b801af010e01af010e01af01b8013402af010e01af010e02af023402af03b801af01340200020002b805af01b8023404af01b801af01340135013405b803000300023401af020e01af01b8023401af04b80135033402b8010e02b8013402000200033403af0434013504b801340135033402af04340100010001340135033403af02340135023401b8013401b8053403af01350334010001340135033403af0100053401af053404af013401350234010002340135023403af0100033404af043404af013403000100063402af0100023405af0135033403af01340400010003340235013401af0234020005af0135043401af013405000200013401350734010005af053401350234040002000b3403af013506340135023403000100063401350534013501b801af01350334013505340300023401000134013502b8010002b8053401b8013502b80100013402b8013402b80300" + }, + { + "filename": "09-tochigi-strawberry-heads", + "data": "0x000416150602000122020001c0010001c008000300012204c003710500020001c0022204c004710300010005c00571010102710200020002c006710101017101010171020002c0017101c0077101010371010001000e71010001000f7101000f7101000f7101000f7102000e7102000d71010003000c710100040004710146027101460371010005000471024603710200070007710200090004710300" + }, + { + "filename": "09-tochigi-toshogu-heads", + "data": "0x00031f1402060001c70f0001c70600070003c7022901c7012908c70700070001e3019601e3012701e3012701e3012701e3012701e3012701e3019601e30700070001e3019601e3012701e3012701e3012701e3012701e3012701e3019601e30700070001e3019601e3012701e3012701c7012901c7012701e3012701e3019601e30700060002c702e3012701e3012701e3012701e3012701e3012702e302c706000500012902e301c7012901c701e302c7015402c701e303c702e301c705000600016d01520141016d0123016d0123016d0123016d0123016d0123016d01410152016d0600050001290100016d01520141016d0123016d0123016d0123016d0123016d01410152016d010001290500090001c7027f01c7037f01c7027f01c70900070002c70154014101c70154014101c70141015401c70141015402c70700010001e301270400016d015201410123016d0123016d0123016d0123016d012301410152016d0400012701e3010001e3012701e30500016d0123016d0123016d0123016d0123016d0123016d0123016d050001e3012701e30154015201c70500017f01c7027f01c7037f01c7027f01c7017f050001c70152015402c70141012901c7012903c7017f01230141017f0300017f01540123017f02c7012903c7014102c701c70152014101e3012701e3012701e30127017f026d017f0300017f026d017f012701e3012701e3012701e3014101c701520341027f01c7027f01c7017f01c70141017f0300017f014101c7017f01c7027f01c7027f034101c701230141027f01c7027f01c7017f01c70154017f0300017f015401c7017f01c7027f01c7027f0141012301c7" + }, + { + "filename": "10-gunma-kusatsu-heads", + "data": "0x00041d15030600020d0200020d0200020d0200020d06000400013201da028802da028802da028802da028801da013204000400013201da023202da023202da023202da023201da01320400050001da025702da025702da025702da025701da0500060002570200025702000257020002570600060002570200025702000257020002570600030003e6025702e6025702e6025702e6025703e6030003000193013e018d0257023e0257023e0257023e02570101013e0193030003000193013e0101033e018d023e018d033e018d033e018d013e0193030003000193013e028d053e018d043e028d023e018d0193030003000193023e018d013e018d013e018d023e018d013e028d013e018d033e0193030003000193018d053e018d023e018d053e018d013e018d0193030003000193013e018d033e018d063e018d013e018d023e010101930300030001930101033e018d033e018d023e018d023e018d013e018d013e0193030003000193033e018d033e047f018d013e018d043e019303000100027f0193033e018d033e017f023e018d033e027f023e027f0100017f017f0200017f03e6017f0ce6027f01e603000100027f0100027f1400" + }, + { + "filename": "10-gunma-negi-heads", + "data": "0x00031915070400014c030001dd0400014c040001dd0300024c020002dd0200024c030001dd03dd0100034c03dd0100034c010003dd04dd034c04dd034c03dd0100010003dd034c04dd024c04dd0100010003dd034c04dd024c03dd0200010004dd024c03dd024c04dd0200020003dd024c03dd024c03dd0300030002dd024c03dd024c02dd0400050001dd014c02dd024c01dd06000500074e06000600054e0700060001c1010101c1010101c10700060001c1010101c1010101c10700060001c1010101c1010101c10700060001c1010101c1010101c10700060001c103ca01c10700060001c1010101c1010101c107000700010101c101010800" + }, + { + "filename": "10-gunma-takasakidaruma-heads", + "data": "0x00061a1607050009410500030002410101014102010741030002000f41020001000141016001410123020102230101022302010123014101e601410100010001e6022301010423010104230101022301e60100014101e60123020103a70101010e010103a7020101230141016001e60160020101a7030101a7010101a7030101a7020101e6016001e60160020101a7030101a7010101a7030101a7020101e6014101e60141020101a7030101a7010101a7030101a7020101e60160014101600223010103a7030103a701010223014101e602410123030101a1010101a1010101a1010101a1030101230241010001410123010e040102410501010e012301410100010002410223010e0123014102010141010e0123010e02230241010002000341010e0123010e0301010e0123010e034102000300014101600141016001410260024101600141016001410300040001e6014101e6024101e6024101e6014101e60400060001e6014101e6014101e6014101e60600" + }, + { + "filename": "11-saitama-tokinokane-heads", + "data": "0x000315140a050002ab0400030006ab020001000aab020001d701b801000292010001b80200010001d7010001b801000292010001b80200038601b801000292010001b80200030001b8040001b80200030001b8048501b80200030001b8048501b80200020008ab010001000aab030001b8048501b80200030001b8048501b80200030001b8048501b80200020001b8068501b80100020001b801b601a401b601a401b6018501b80100020001b8068501b80100020001b8068501b80100" + }, + { + "filename": "11-saitama-whitetiger-heads", + "data": "0x00031a1406020002010b00020103000100040109000401020001000101015f020109000201015f010102000201025f020107000201025f01010200090103e3060102000100030101e3050101e3050101e3010102000200010101e3040101e3030101e3040101e302000200040101e3020101e3010101e3020101e303010200020010010200020001e30e0101e30200020010010200020010010200020001e30e0101e30200020010010200037f01e3017f01e303010320030101e3017f01e3027f02000801022006010200037f01e3017f01e3010101e3020101e3020101e3010101e3017f01e3027f0200060102e3010102e305010200" + }, + { + "filename": "12-chiba-loquat-heads", + "data": "0x0003181508070002c9070006000426060004000826040003000a26030002000c26020001000e26010001000e260100102610261026102610261026102601000f26010006260186012601860526010002000626018605260200040008260400050006260500" + }, + { + "filename": "12-chiba-nanohana-heads", + "data": "0x00051d14030700012a0300012a0200012a0200012a0100012a0300012a02000300012a0100012a0100022a0100022a0100012a0100022a0100022a06000200012a0100122a0100012a02000200172a01000100062a0122112a01000100152a0122022a01000100032a0122152a1a2a042a01c0102a01c0042a032a02c0012a01c00d2a02c0012a01c0022a0100012a01c0012a02c00d2a01c0012a02c0032a0100012a01c0012a01c0012a01c00c2a01c0012a01c0012a01c0012a0100012a0100012a03c00e2a03c0022a0100022a01c0012a01c0012a01c0042a0122072a01c0012a01c0012a01c0012a0100012a0100012a03c0062a0322052a03c0012a02000100012a020001c0102a01c0012a0100012a0100" + }, + { + "filename": "12-chiba-soysauce-heads", + "data": "0x000317140b010008b40300020006b4020001850100020006b404000200066f030001850200016f0101046f04000200016f0101046f04000100016f01b8010104b8016f03000100016f010105b8016f0300026f06b8026f0200026f06b8026f0200016f08b8016f0200016f08b8016f0200016f08b8016f0200016f08b8016f0200016f08b8016f0200016f02b803ea03b8016f0200016f08b8016f02000a6f0200" + }, + { + "filename": "13-tokyo-station-heads", + "data": "0x00011c14050b0001360b0017000b0001360b000b0001360b000700030d0336030d07000600010d010b010d0136010d010b010d0136010d010b010d06000600030d0136030d0136030d06000100013604000bbf040001360100060001bf020b01bf030b01bf020b01bf0600010001360300040d0136030d0136040d03000136010003360100010d010b020d0136010d01bf010b01bf010d0136020d010b010d0100033603bf030d01350136020d03bf020d01360135030d03bf010b02bf010b01bf010b010101bf010b01bf030b01bf010b01bf0101010b01bf010b02bf010b010b02bf010b01bf010b010101bf010b01bf030b01bf010b01bf0101010b01bf010b02bf010b06bf010109bf010106bf010b02bf010b01bf010b02bf010b01bf030b01bf010b02bf010b01bf010b02bf010b010b02bf010b01bf010b02bf010b01bf030b01bf010b02bf010b01bf010b02bf010b170d010b02bf0272010b04bf037201bf010b02bf010b027202bf010b010b02bf0272010b04bf037201bf010b02bf010b027202bf010b" + }, + { + "filename": "13-tokyo-tower-heads", + "data": "0x0001181408030001e0010001e0010001a201e0010001e0010001e00300030003e0010001a201e0010003e00300030003e0010001a201e0010003e00300030001e0010001e0010002e0010001e0010001e00300020001e0020002e001a203e0020001e00200020001e0010002e0010001a201e0010002e0010001e00200020001e0010002e0010001a201e0010002e0010001e00200020001e0010001e0020001a201e0020001e0010001e00200020001e0010001e0020002e0020001e0010001e00200020003e0010001e001a202e0010003e00200020001e0010002e0010001a201e0010002e0010001e00200010001e0020002e0010001a201e0010002e0020001e00100010001e0010002e0020001a201e0020002e0010001e00100010001e0010002e0020002e0030001e0010001e00100010001e0010001e0020001e002a201e0020001e0010001e00100010003e0020001e002a201e0020003e0010001e0020001e0010001e0010002a2010001e0010001e0020001e001e0010001e0020001e0010002a2010001e0020001e0010001e001e0010001e0010001e0020002a2020001e0010001e0010001e005e0020002a2020005e0" + }, + { + "filename": "14-ibaraki-anglerfish-heads", + "data": "0x00031e14010700059811000400027e0a980d000300047e0b980b000200047e03000a980a000200037e06000a9808000300017e06000c98070008000f9806000600129805000500149804000400159804000100037e1598037e0100047e1598047e047e1598047e0100027e010015980100027e0100050005980a3905980400050003980e39029805000600019810390198050008000e980700" + }, + { + "filename": "14-kanagawa-curry-heads", + "data": "0x00041c1504013d0206100003010200013d02060f000201022c01010100017f020106000401040002010222022c0101017f020104000801020001010257022201dd0101017f02010300040102d40401010002010157022201dd0101017f02010200030104d40235030101000201012202010100013d02a90100030105d4043502010100030102000400020105d40535020106000300030105d40635020105000300020106d40635020105000300020106d40635020105000300030105d40635020105000400020104d40635020106000400030103d40635020106000500030101d401860142016003350201070006000401033503010800070008010900090004010b00" + }, + { + "filename": "14-kanagawa-king-heads", + "data": "0x0002171409070001210600070001a90600070001a90600060001a7011301a70500050001a7011301a7011301a70400040001a7011301a7011301a7011301a703000200012101a9012101a9012101a9012101a9012101a901210100030001b3014201270142012701420127014201b3020003000149011301270113012701130127014201490200010003a9012101a9012101a9012101a9012103a902000113014201b3012701b3012701b3012701b3014201130100020001420113014901270149012701490127014901130142010002000113014201b3012701b3012701b3012701b3014201130100020001420113014901270149012701490127014901130142010002000113014201b3012701b3012701b3012701b3014201130100020001420113014901270149012701490127014901130142010002000113014201b3012701b3012701b3012701b3014201130100020001420113014901270149012701490127014901130142010001a9012101a9012101a9012101a9012101a9012101a9012101a90121" + }, + { + "filename": "15-niigata-sasadango-heads", + "data": "0x00021c1604100001e107000e00011b01e108000d00021b070002e10c00031b040004e101000b000129021b030006e101000800021b0129011b0129020007e10200050001290100021b0129021b0129010008e1020005000129031b0129011b0129011b08e103000500011b0129011b0329021b08e103000400021b0429031b08e103000400031b0229031b08e104000300031b0429011b01e103dd05e104000300021b0129011b0129021b012905dd03e105000300011b0129021b0129021b06dd03e1050003000129021b0129021b07dd02e106000100031b0229021b01e106dd03e10600041b0129021b01e102dd0197019801dd010101dd02e10700041b020002e1019702980197010101dd03e10700031b030003e101980197019801dd03e10800060009e10900070006e10b00" + }, + { + "filename": "15-niigata-tulip-heads", + "data": "0x00041a1506090002b90900080004b90800010002b9040006b9040002b9010004b9030006b9030004b905b9010008b9010005b914b914b914b914b914b914b914b9010012b90100010012b90100020010b90200020009b9016a06b90200040006b9016a05b90400060008b90600" + }, + { + "filename": "16-toyama-blackramen-heads", + "data": "0x00041b150508000633080006000a33060004000e3304000300053306850533030002000433038502d3058504330200010003330385018803d303e4048503330100010002330285018803d302010222010103e402850233010003330285018802d3070103e40185033302330285018803d3082202e40285023302330285018802d3092203e4018502330233028503d3080104e4018502330333018504d3062204e40185033301000233028504d3040104e4028502330100010003330185018805d3078503330100020003330185018803d3028503e402850333020003000333048503e40385033303000400043306850433040006000a330600" + }, + { + "filename": "16-toyama-kutabe-heads", + "data": "0x00031a17010d00060e06000b000a0e04000400010e04000e0e02000300010e04000f0e02000300020e0300100e01000300030e0200050e0501060e01000400070e0a01040e0500050e0101040e0201040e0101030e0400060e0401010e0201010e0401030e0300070e0c01030e0200080e0101030e0401030e0101030e01000a0e0101010e0101010e0201010e0101010e0101040e0100090e0101030e0201010e0101030e0101030e0100090e0701010e0401030e0a0e0701010e0401030e0a0e0501020e0501030e0a0e0c01030e0100090e0401040e0401030e0100020e0100020e0100030e01000401020e04010100030e0200010e0100020e0200010e040006010400010e01000500010e1300" + }, + { + "filename": "16-toyama-raicho-heads", + "data": "0x00031d15021200047f05001100077f03001100047f020e017f010e02000600010f0a00077f020e0100050001dd010f01dd0800077f0400050001dd017e01dd010f0400097f0500017f0500017e01dd010f02000c7f04000100010e017f0200010f01dd017e107f03000100017f020e157f02000200177f02000200177f02000300167f02000300157f01dd010001dd010001dd0200137f010001dd010f01dd010001dd010f0200117f0100010f01dd017e010001dd017e010f01dd0300067f030e057f010001dd010f017e02dd0200017e01dd010f03000a7f040001dd017e0300010002dd017e010f0300027f0400027f0500010f017e02dd02000300010f037e0100027f010e0300027f010e0300027e010f0400" + }, + { + "filename": "17-ishikawa-curry-heads", + "data": "0x00071c1504060001010172020108720600040003720ab8037204000300027201b80225013403250234022502b8022201720300020002720325013401250134012502340125013402250422017202000100027201250134012502340125033401250234012501340125032202720100010101b80125013401250234012502340125013401250234012501340125042201b80172010101b80125013401250234012501340225013401250234012501340125042201b80172017201b802250134012501340125013401250234022502340225042201b80172010101b8013401250134012503340125013401250134012502340125042202b80172027201340225023401250234032502340225042201b802720100027201b802250134032501340525032202b802720100020003720fb8027202000300037204b8036406b8027203000500037208b80372050007000a720700" + }, + { + "filename": "17-ishikawa-jibuni-heads", + "data": "0x00051a140608000423080005000a23050003000323011001230210072303000200102302000100042304e101b804d80523010001000323055c01e1046002b8032301000323016a01b804e101b804d803b803230223015f016a02b80483026004d802b802230223015f02b8051a012201b8046002b80223012302b8023401b80183021a0222018304d8026d01b80123010001230434061a0460026d0123010001000223023402490383031a04b802230100020003230249031a038302b8032302000300032301de0123038301b8012301de032303000400032301de052301880223040006000223018801de022301de01230600" + }, + { + "filename": "17-ishikawa-kinpaku-heads", + "data": "0x000518150705a6076d05ea03a60b6d03a60aa6066d01ea09a6086d07a60a6d10a6016d11a611a604ea0da611a6046d0da609ea08a603ea056d09a60aea07a606ea036d01a603ea04a6036d07ea07a603ea03a60bea" + }, + { + "filename": "18-fukui-dinosaur-heads", + "data": "0x00071c16011600011b0123031b1500061b0d0001e8011b0600041b02000b0001e8011b01e8011b01e8011b01e80200071b011b0900011b01e8011b01e8011b01e8011b01e8011b01e8031b012a03000100011b070001e8011b01e8011b01e8011b01e8011b01e8011b01e8021b012a04000200021b050001e8011b01e8031b01e8011b01e8011b01e8021b012a04000300041b01e8011b01e8051b01e8061b05000400022a071b01e8081b05000600022a051b01e8081b05000800012a091b022a0100041b02000900032a021b01e8032a09000c00031b0c000d00021b0c000e00011b0c000e00021b0b00" + }, + { + "filename": "18-fukui-sabae-glasses-heads", + "data": "0x00091c1206030004710800047103000100027102060201027104000271020602010271010001000171020603010106017104000171020603010106017101000171020603010306047102060301030601710171010603010406017102000171010603010406017101710301050601710200017103010506017101710201060601710200017102010606017101000171060601710400017106060171010001000271040602710400027104060271010003000471080004710300" + }, + { + "filename": "18-fukui-tojinbo-heads", + "data": "0x00051c15050d00037407000800037402000374027205000500037203740272037402720274030005000372037402720374027202740300030002740372037402720374027202740300030002740372037402720374020502740300030002740372037402720374020502740300030002740372037402720374020502740300030002740372039902720374020502740300030002990372039902720374020502740300030002990305039902720374020502990300030002990305039902720399020502990300030002990305039902720399020502990272010003000299030503990205039902050299027201000100027702990305030c02050399020502990272017703000299030503990205039902050299027701000177010013770200" + }, + { + "filename": "19-yamanashi-shingen-heads", + "data": "0x00011c1604050001280d0001280400040001280f0001280300040001280f000128030004000228010005010100050101000228030004000228010101280901012801010228030004000101022802010328010103280201022801010300020004010428010101060128010601010428040101000100015501a90155040109280401015501a901550100015503a90155010101a901550128012901280129012801290128015501a90101015503a901550100015515a901550100045501a9055503a9055501a904550200020103550488035504880355020101000200030101550d88015503010100020004010d8804010100010005010d8804010100010005010d88040101000100050101230388012302880160012303880123040101000100050104230188036001880423040101000100050105880323048805010100010006010388012303880123038804010200010004010100010102000788010005010200010101000201010001010a000201010002010300" + }, + { + "filename": "19-yamanashi-wine-heads", + "data": "0x0001161409050003e705000500035b0500050003e70500050003e705000500037905000200011b082202000100011b0a220100011b01c00a2201c0011b01c00a2201c0011b01c00a2201c0011b01c00a2201c0011b01c00a2201c0011b01c00a2201c0011b01c00a2201c0011b01c00a2201c0011b01c00a2201c0011b01c00a2201c0011b01c00422021b042201c0011b01c00322011b0222011b032201c00100011b01c0082201c00100" + }, + { + "filename": "20-nagano-matumotocastle-heads", + "data": "0x00011f16020a00010d0300010d0e000a0001e3030d01e30e000a0001e3030d01e30e000800020d01e3030d01e3020d0c00090007010d000900030e0123030e0d000800090d0c000700050d01e3050d0b000900020101e3010101e302010d000800020d01e3030e01e3020d0c0006000d0d060001e30300040001e30200040103230401060001e3010101e30200030001e3010101e30100040e0323040e050001e3030e01e30100020001e3030e01e30c0d0300070d010007e30c0d0400030e02000200016602e302660c0104e3050d0100010006e3040e0523030e03e3070d08e30c0d080e010002000123018501230185050102660301036603e3070d01000618040e02bc030e04bc0136010e0136050101000200040101de03d802de02d801de03d801de023601970136050e0100060002d801de03d801de03d802de01d801de0197010e019702de01d801de01d801de" + }, + { + "filename": "20-nagano-wasabi-heads", + "data": "0x0003161505040002220100024e08000100024e01000222034e08000122024e0222034e09000122034e0122014e0222090001000122034e032201c90122070002000622014e022206000200013f022201c9014e042206000200013f014e0622014e01c90500030001c90922040003000a22040003000422014e062203000400013f014e0522014e0322020005000922014e020005000b22010006000122014e082201000700042204850122014e080001c9014e062201c90a00013f06220c000322014e0100" + }, + { + "filename": "21-gifu-gassho-summer-heads", + "data": "0x00021d14040b0003d80b000b0003d80b000a0002d8018402d80a00090002d8038402d80900080002d80184037c018402d80800070002d8028402010123028404d80500070001d8028401ca0201012301ca028401d80700060001d8028407ca028401d80600050001d80184057c01ca057c018401d80500040002d8018401ca030103ca030101ca018402d80400030002d8028401ca030103ca030101ca028402d80300030001d802840dca028401d80300020002d8018402ca020101ca020101ca020101ca020102ca018402d80200010002d8018403ca020101ca020101ca020101ca020103ca018402d80100010001d8028401ca0f7c01ca028401d8010002d8018401ca117c01ca018402d802d8018401ca118401ca018402d802d8018403ca010102ca010105ca020105ca018402d802000dca020106ca0200" + }, + { + "filename": "21-gifu-gassho-winter-heads", + "data": "0x00021d14040900070109000800030103d8030108000800030101d8018401d8030108000700030101d8038401d8050105000600030101d80184037c018401d8040105000500030101d8028402010123028401d8010102d805000400030101d8028401ca0201012301ca028401d80200010104000300030101d80184030103ca0301018401d8030103000200030101d80184050101ca0501018401d8030102000200030101d801840bca018401d8030102000100030101d802840bca028401d8030101000100020101d802840dca028401d802010100030101d801840fca018401d80301020101d8018411ca018401d80201010101d8028401ca0f0101ca028401d8010102d8018401ca110101ca018402d802d8018401ca118401ca018402d802d8018403ca010102ca010105ca020105ca018402d802000dca020106ca0200" + }, + { + "filename": "21-gifu-keichan-heads", + "data": "0x00021d1a03040002061400060004060500050606000a000106090003060300040006060100017d029c0900010602000300010605000322017d029c0200060603000400090601d2019c010001060900030003ca0123022203e901220106017d029c0106022303ca0300020002ca0223022201e9037d01220106027d019c017d0106010c022302ca0200010002ca0123020c022201e9067d0222017d0106019c020c012302ca010002ca0123030c027d0122047d0122017d02220106017d019c030c012302ca02ca0123010c0422039c017d0222017d0322015c0322010c012302ca0123010c0123010c0322037d019c0422037d019c0322010c0123010c0123012301ca0123010c0322047d029c0322027d029c017d0122010c012301ca01230123010c0123010c015c0222077d025c037d019c027d01220123010c012302ca01230122010c0322027d0322017d0222047d019c0222012302ca02ca0123010c0422017d029c037d0422027d0222010c012302ca03ca0123030c015c0222065c0222027d0122010c012303ca010003ca0223030c0322027d02e9040c022303ca0100020004ca0e2304ca0200030014ca03001a001a001a000c00013d0101013d01010a000d00013d0100013d0a00" + }, + { + "filename": "21-gifu-ukai-heads", + "data": "0x00031e190404000b540b0003000d540a0011540900010004920d540800020002920f540700030010540700030010540700020011540700020005540c0c0700020002540f0c0700140c06000100040c0401050c01a6030c0101010c0600040c0601030c03a6010c0201010c06000100030c0601010c07a60101010c06000200020c04010ea603ad01000200020c040103a603e901c601220210070001ad0300010c050103a603e901c60122021007000400010c050104a602e901c6021007000f0002e90122011001a602ad0400110001220110020002ad03001200012201100600110001c602e901c60500100001c6040001c60400" + }, + { + "filename": "22-shizuoka-oden-heads", + "data": "0x0004181407060001b1016001b10800060003c904000286019701000100025b030001b1016001b1010001600100048601970100025b01000160010003c9010001600100048601970100025b01000160010003b10100016001000586035b01000160010001c9016001c901000160020003860100035b010001600200016002000160030001600200025b020001600200016002000160030001600200025b020001600200016002000160030001600200025b020001600200016002000160030001600200010001600200016002000160010003e9020001600200010001600100036301000160010003e90200016002000100016005630160010003e90200016002000100016005630160010003e9020001600200010001600563020002e9016a05000100016005630200026a01e9050003000363030002e90600" + }, + { + "filename": "23-aichi-hitsumabushi-heads", + "data": "0x00071a15060800040e08000500050e0134040e05000300040e0234012b013401350134040e03000200010e010b033401350234012b023401350334010e02000100010e010b0134012b03340135053401350234010b010e01000100010e01350234012b0634012b033401350134010e0100020e0834013506340135020e020e023401350234012b033401350334012b0234020e020e010b023401350b34012b020e030e010b093401350334030e050e023401350234012b03340135050e0100080e0234080e01000100120e01000200100e020004000c0e0400" + }, + { + "filename": "23-aichi-nagoyacastle-heads", + "data": "0x00021b15010b0001da070001da06000b0002da053f02da06000b00093f06000a000b3f05000b00010101e3010101e3010101e3010101e301010600090001210b3f012104000900063f0101063f04000a000501013f050105000900013f010102580121013f010e013f012102580101013f04000900043f050e043f040001e307000f3f0300010101e3050002210d010221020003e304000221013f010e013f0101015801010158010101580101013f010e013f02210200020104000121023f030e073f030e033f0121015801010400143f03e30400016f01580101015801010158016f0158016f0158016f01580101015801010158016f0158010004e3020014e3030104000101015801010158020101580101015801010158020101580101015802010100030104e301780105015901630178025902dd0259010502dd01590163015901050100015e0159015e040101d8015e0178025e0163025e01d8015e0178035e0178015e01d8015e0100" + }, + { + "filename": "23-aichi-tenmusu-heads", + "data": "0x00011b1406090001ce010001ce0900090003ce0900090003ce0900090003e70900070001bc05e701bc0700060001bc010105e7010101bc0600050001bc010107e7010101bc0500050001bc020101e7030101e7020101bc0500040003bc070103bc0400040005bc030105bc0400030007bc010107bc030003000fbc0300020010bc0300020011bc0200020011bc0200020011bc0200010013bc0100010007bc010101bc010101bc010107bc010015bc15bc" + }, + { + "filename": "24-mie-jingu-heads", + "data": "0x00041e14010100012a0200012a1200012a0200012a02000200017e0100017e1300017e0100017e02000300017e0100012a0100012a0100012a0100012a0100012a0100012a0100012a0100012a0100012a0100012a0100017e0300027e19c6027e020019ab020001001bab010001001bab01000eab01880eab0cab05880cab0aab028802d8018802d802880aab020001d805d3028804d8018804d8028805d301d80200020001d803d3118803d301d802000160010001d801d3028801d301880dd3018801d3028801d301d801000160076001880d60018807600160010001d801d301600200018801600bd3016001880200016001d301d8010001600160010001d801d301600200018801600bd8016001880200016001d301d8010001600160020001d301600200018801600bd3016001880200016001d302000160" + }, + { + "filename": "24-mie-ninja-heads", + "data": "0x00041717050700069205000500039201bc069203000400039201bc059201bc029202000400039201bc069201bc019202000300039201bc01e302da010101da010101da01bc029201000300039201bc01e301da01e3010101da010101da01e301bc019201000200039201bc0a880292020003920b880292020003920b880292020003920b8802920200039203a2078801a20292020003920ba20292020003920ba20292030003920aa2019201000300039209a2029201000200059202a2039203a201920200020002920100039206a202920200010003920300029204a202920300010003920e0002921000" + }, + { + "filename": "25-shiga-blackbass-heads", + "data": "0x00021d18021700018d0100018d01001700038d01001600058d1700048d0a00016b0c00038d01000900036b010003c50157012303c50100038d02000800036b02c5011e02c5025702c50100028d04000500026b0100016b02c5031e06c50100038d03000500036b01c5041e01c5011e05c5028d05000400036b01c5031e01c5041e02c5010101c5030104000400026b01c5031e01c5031e0101016b060105000400016b01c5061e0201016b0201011e03010600050001c5031e01c5011e0201016b0201031e02010600050001c5041e0201016b0201031e02010700050001c5021e01c50201016b0701011e0700040001c5021e01c5011e0101016b0701011e0800046b01c5011e01c5011e016b040103c50101021e0800046b011e01c5011e016b08010100011e0900056b08010e000100066b0300031e0e000300046b0300021e0f000300046b14000400036b1400" + }, + { + "filename": "25-shiga-hikonecastle-heads", + "data": "0x00021d15020a00010d0700010d0800090001bc090001bc070009000bbc070009000bbc0700090004bc010d01eb010d04bc0700080003bc01eb010d0301010d01eb03bc06000900020101a2050101a202010700080001ab010103a20101010d010103a2010101ab0600070006bc010d0101010d06bc0500060006bc010d0301010d06bc040007000401010d0501010d04010500040003bc0101010d010109bc0101010d010103bc0200040003bc010d0101010d010101a2020101a2020101a20101010d0101030d01bc0200030002bc020d03bc020d05bc020d0101020d0201010d01bc01000400030101a202ab030101a202ab0301080d0100120d07010100010d0101120d060101000301120d010101a201ab020101000101017404010174020101740201017403010174030106ab01000101017412010700" + }, + { + "filename": "26-kyoto-kinkaku-heads", + "data": "0x00011d15020c00026d010001290b000d00016d01a60c000c00010102290c000c0003b8060001b80500040001b8030004b801a6018506b8018506000500018504b803a605e60900080002a601e40129010101a6016d01a6016d01a6090007000129016d018a016d018a0129018a016d01a6016d018a02290700060008b8028504b80700020001850ab8018504e606b801850200040001290100012907a60101012901e4012901e6012901e601290500040001290100012904e403290101012901e4012901e4012901e402290400030006290e850400030006850135018501a00135018503010185010101850101018505000400018501a0018501a00135010a018501ea010a018501ea023505850500040001850100018502ea010a018501ea010a018501ea0235018501010185010101850500030013850500030001b6015701ab015701b6015701b6015701ab0157019808570500020002a5015901ab01a501b6015901a5015901ab015902a5025901a5015901a5015904a5010001a5030002a5028502a5010a018502a5018501a5028502a50185010102a5040001a5010002a5018501a0018502ea010a018501ea01a5018501a50235028502a5018502a50300" + }, + { + "filename": "26-kyoto-kiyomizu-heads", + "data": "0x00061a14051584010801970208019702080197020801970208019702080197020801970108010001840200018402000184020001840200018402000184020001840100010801970208019702080197020801970208019702080197020801970108010001840200018402000184020001840200018402000184020001840100010801970208019702080197020801970208019702080197020801970108010001840200018402000184020001840200018402000184020001840100010801970208019702080197020801970208019702080197020801970108010001840200018402000184020001840200018402000184020001840100010801970208019702080197020801970208019702080197020801970108010001840200018402000184020001840200018402000184020001840100010801970208019702080197020801970208019702080197020801970108010001840200018402000184020001840200018402000184020001840100010801970208019702080197020801970208019702080197020801970108010001840200018402000184020001840200018402000184020001840100" + }, + { + "filename": "27-osaka-osakacastle-heads", + "data": "0x00021b1406070001da050001da07000700073f07000700073f07000600043f01e3043f0600070001e301ad03e301ad01e30700040001da0100010e01e7010e01e7010101e7010e01e7010e010001da040004000221023f012103010121023f02210400040001210b3f01210400040002210101015802010158020101580101022104000300072101a607210300010001da02000401013f0301013f0401020001da01000100032101010158013f01a601010358010101a6013f015801010321010001000121113f012101000100043f01a6093f01a6043f0100010001210101013f0301013f01580101015801010158013f0301013f0101012101000100022101a601580101015801a6013f0321013f01a601580101015801a6022101001521010002c102580101015802c1035802c101580101025802c10100010013010100" + }, + { + "filename": "27-osaka-takoyaki-heads", + "data": "0x00021e15020b0001af010001af020001af027d0900090001af027d01af0100017d01af010002af09000600017d010001af017d03af017d01af020b017d010003af060003000157020001af017d02af017d01af020b01af0134017d013401af027d0700040001570100017d01af010b01af0134010b01af01dd0134010b037d010b010001af0600050001570100010b02af01dd01af013402af017d0134010b03af010001af05000600015701af023401af010b02af010b023402af020b01dd01af050006000134010b02af010b0234010b0234020b0111010b0234010b050005000134020b0134010b013401af020b0211010b01dd0111010b0111010b01340200027f0100050001dd010b0534010b01110260020b0260020b01340100017f0200017f0500020b0134010b0234020b0111019302600293036001110100037f010005000334010b0134020b0b60050005000234020b0134010b01110260039303600393050005000134010b0234010b013401110b6005000600040b0111046002930560060006000134010b0234011101930134019305600293016006000200037f0200023402110160053404600700017f0300017f0300013401110260013403600293026008000100037f03000234011101930134076009000b00036003930b00" + }, + { + "filename": "27-osaka-tower-heads", + "data": "0x000216150b05000195050004000395040002000195063c020003000195043c0300040003c604000100016f0195016f01c6019501c6016f0195016f01000295016f019501c6019501c60195016f02950100016f0195016f01c6019501c6016f0195016f01000300019501c6019501c6019503000300019501c6019501c6019503000300019501c6019501c6019503000200029501c6019501c6029502000200029501c6019501c6029502000200029501c6019501c60295020001950a3c0195033c01a2013c01a2043c0100016f039501a20395016f010001000195016f019503000195016f019501000100016f019505000195016f010001000195070001950100" + }, + { + "filename": "28-hyogo-arimaonsen-heads", + "data": "0x0003171409020003a60900010001e704a6080001e703a6012904a6050001e706a6012902a6040001e708a605000100016d01e703a60400019d014602000200016d02ea05000106012802000a00019d014602000a00019d014602000a00019d014602000a00019d014602000a00019d014602000a00019d014602000a00019d014602000500049d0106019d0128020003000406010005ce0100020001060301030001ce012901ce0229010003010106020006ce0100" + }, + { + "filename": "28-hyogo-himejicastle-heads", + "data": "0x00021a15010b00017f0700017f05000c0007e006000c0001e0019d01e0019d01e0019d01e006000b0002e0019d0301019d02e005000c00070106000c00010101920101019d01010192010106000800017f020001e0019d01e0019d0101019d01e0019d01e00200017f0200090001e0019d01e0019d01e0019d01e0019d01e0019d01e0019d01e003000700017f02000101029d01010192010101920101029d01010200017f01000800017f01e0019d0201019d03e0019d0201019d01e0017f02000300017f040002e005010192050102e0020003e00500017f01e0010101920101019201e0010101e00192010101920101027f020001e0019d02e00300019d01e0019d01e0019d01e0019d0301019d01e0019d01e0019d01e0019d01000192010101920300037f040105920501020001e0019d01e0019d01e00100037f010101920101079201010192020102000101019201010192010101e0019d01e0019d01e0019d01e0019d01e0019d01e0019d01e0019d01e0019d01e0019d01e0019d019d01e0019d01e0019d01e0019d016f0201019201010192010101920101019201010192010101920201016f01000192010101920101019201010192100102000401019d01e0019d01e0012b0250012b0350012b0250012b0350012b0200012b0150012b015001920101019201010250012b0250012b0250012b0350012b02500200" + }, + { + "filename": "28-hyogo-tajimaushi-heads", + "data": "0x0004191504010002b50f0002b5010002b5110002b502b5030b050d0200040d030b02b5050b0c0d040b0100040b0c0d030b01000300010b0d0d010b0300150d150d150d0100130d01000300100d020004000c0d05000400060d0ab501000400050d0bb501000400050d05b5020d01b5020d01b501000400050d0bb501000400050d02b5070d02b5010009000ab50200" + }, + { + "filename": "29-nara-ashura-heads", + "data": "0x00021f140203180a00019f01c2019f0a000318020002e40700029f03c2029f070002e40200020002180600029f05c2029f0600021802000200021806000118019f01c2031801c2019f01180600021802000200021806000123021801230118012302180123060002180200020002180600091806000218020002000218060001230218032302180123060002180200020003180600071805000418020003000418060003180400021801dd031803000500021801dd041801e4031801e401dd041801dd010002e4030003000118030001dd041801e4031801e401dd0218040002180300020003180400041801e4011801e401dd0318040002180300020002e40400011801dd061801dd021801dd021802000218030002000218020001dd031801dd021801e4011801e401dd011801dd031801dd010002180300020003180100011801dd061801dd061801dd0418030003000a1803dd051802000218040004000218010003180100011803dd031801000318070007000218030002dd03180300021807000c0005180c00" + }, + { + "filename": "29-nara-deer-heads", + "data": "0x00051b140702110a000211060001110138011108000111013801110600011102380135060001350238011106000111033801350400013503380111060001000111025702350200023502570111070002000a11080002000a11080002000a11080002000a11080002000a110800020001350e110323020001350511095703230200013505110c5702000135010b041101230b5702000135051101570223095701000135010b0111010b03110c57" + }, + { + "filename": "30-wakayama-danjogarandaito-heads", + "data": "0x00011914080800019508000800012108000800019508000800012108000700012701e301270700060001e3012701e3012701e30600040001e3012701e3012701e3012701e3012701e30400020001e3012701e3012701e3012701e3012701e3012701e3012701e3020002000db40200050001b4010101b4010101b4010101b40500050007b405000500012801dd01b401dd01b401dd012805000400090104000100012701e3012701e301270501012701e3012701e30127010001e3012701e3012701e3012701e3012701e3012701e3012701e3012701e3012701e3030001b401dd01b4010101b4010101b4010101b401dd01b40300030001b401dd01b401dd01b401dd01b401dd01b401dd01b4030003000bb40300030001b4010101b4010e01b4010e01b4010e01b4010101b403000100047f07e0047f0100" + }, + { + "filename": "30-wakayama-nachifall-heads", + "data": "0x000216150a0100036102e001610101046101610327020101e001010227016101000227019d012701e0010101e0010103270100039d016201e00301026202000400010101e0010101e004000400020101e001010400040001e0030104000500010101e001010400050001e0020104000500030104000500020101e00400050001e0010101e004000500010101e001010400050003010400050003010400050003010400030001010100016201010162010102000101050001010162020103000500020101000101010001010100020001010100010101000101010001010300" + }, + { + "filename": "30-wakayama-wakayamaramen-heads", + "data": "0x00041b150508000633080006000233060102330600040002330a010233040003000133040106d804010133030002000133030102d8016001d8017d026003d803010133020001000133020103d80260037d01d80160025b02d802010133010001000133010102d8027d0160047d010f035b016002d80101013301000133020101d8067d030f017d025b026001d8020101330133010101d8077d030f046003d8010101330133010101d8067d040f066001d8010101330133010102d8057d040f066001d8010101330133020101d80160047d040f056001d80201013301000133010101d8067d076002d801010133010001000133020101d8047d0160026c01d8026001d8016001d802010133010002000133020101d8027d0160016c02c1016c01d8026001d802010133020003000133020102d80160016c02c1016c016002d802010133030004000133030102d8026c02d803010133040006000133080101330600" + }, + { + "filename": "31-tottori-dummy-heads", + "data": "0x00041b150508000633080006000233060102330600040002330a010233040003000133040106d804010133030002000133030102d8016001d8017d026003d803010133020001000133020103d80260037d01d80160025b02d802010133010001000133010102d8027d0160047d010f035b016002d80101013301000133020101d8067d030f017d025b026001d8020101330133010101d8077d030f046003d8010101330133010101d8067d040f066001d8010101330133010102d8057d040f066001d8010101330133020101d80160047d040f056001d80201013301000133010101d8067d076002d801010133010001000133020101d8047d0160026c01d8026001d8016001d802010133010002000133020101d8027d0160016c02c1016c01d8026001d802010133020003000133020102d80160016c02c1016c016002d802010133030004000133030102d8026c02d803010133040006000133080101330600" + }, + { + "filename": "32-shimane-dummy-heads", + "data": "0x00041b150508000633080006000233060102330600040002330a010233040003000133040106d804010133030002000133030102d8016001d8017d026003d803010133020001000133020103d80260037d01d80160025b02d802010133010001000133010102d8027d0160047d010f035b016002d80101013301000133020101d8067d030f017d025b026001d8020101330133010101d8077d030f046003d8010101330133010101d8067d040f066001d8010101330133010102d8057d040f066001d8010101330133020101d80160047d040f056001d80201013301000133010101d8067d076002d801010133010001000133020101d8047d0160026c01d8026001d8016001d802010133010002000133020101d8027d0160016c02c1016c01d8026001d802010133020003000133020102d80160016c02c1016c016002d802010133030004000133030102d8026c02d803010133040006000133080101330600" + }, + { + "filename": "33-okayama-denim01-heads", + "data": "0x00061815090a54042b01540799010c0299042b019907540199075401540599015401990154059901540754019907540754019907540754019907540754019907540754010007540754010007540754010007540754010007540754010007540799010007990706010005060101015407060100050601010154" + }, + { + "filename": "33-okayama-denim02-heads", + "data": "0x00061815090a92042b01920799010c0299042b01990792019907920192050c019201990192050c0192079201990792079201990792079201990792079201990792079201000792079201000792079201000792079201000792079201000792079901000799079d0100059d01010192079d0100059d01010192" + }, + { + "filename": "33-okayama-denim03-heads", + "data": "0x00061815090a92042b019207ca010c02ca042b01ca079201ca07920192050c019201ca0192050c0192079201ca0792079201ca0792079201ca0792079201ca079207920100079207920100079207920100079207920100079207920100079207ca010007ca079d0100059d014d0192079d0100059d01010192" + }, + { + "filename": "33-okayama-dog-heads", + "data": "0x00031a1506010003260c00022602000100015703260a000226015702000100025703260800022602570200010003570c2602570200010002570e2601570200010003260601016a05010226020001000801036a0601020001000801010f016a010f06010200010003010d26010102000100112602000100052603570326035703260200010011260200132601000826095701ca0101015707260a5701ca0123015701000526075701ca065702000426085702ca015f01db01ca0157030004260957015f01db018801001000025f0200" + }, + { + "filename": "33-okayama-horseshoe-crab-heads", + "data": "0x00051815010a00088e0500090003d5098e02000800028e02ca01d5068e0101028e0100060001ca048e01ca01d5028e04c3018e0101018e01000700048e01ca01d5088e0101018e050001ca058e01ca01d5088e0101018e0600018e01c3018e01c3018e01ca01d5088e0101018e0600058e01ca01d50a8e06ca058e01ca01d5048e04c3028e0600058e01ca01d50a8e0600018e01c3018e01c3018e01ca01d50a8e050001ca058e01ca01d50a8e0700048e01ca01d50a8e060001ca048e01ca01d5028e04c3048e0800028e02ca01d5098e0100090003d5098e02000a00088e0500" + }, + { + "filename": "33-okayama-momotaro-heads", + "data": "0x00021914050200020c10000100030c1000040c1000030c0201040c0500040c020003000101060c0374060c010002000174080c0174080c01000274050c0301016a0301050c010001740101040c0301036a0301040c01000201040c0301010f016a010f0301040c01000201030c0b57030c01000274030c0b57030c010001740157030c0b57030c010012570100010012570100010012570100020001741057010003000557040c0757010003001057010004000e570200" + }, + { + "filename": "33-okayama-monkey-heads", + "data": "0x00051a140605000aca050003000eca0300020010ca0200010003ca0601016a050102ca020001000801036a0601020001000801010f016a010f060102000100030106db01ca06db01010200010003ca0ddb01ca020003db01ca0ddb01ca020003db01ca0ddb01ca020003db03ca0adb01ca030003db02ca0edb0100020003ca0fdb020003ca05db0174010101740101017401010174010101740101030003ca0edb03000eca0300" + }, + { + "filename": "33-okayama-peach-heads", + "data": "0x00041e15030d00015f0d000a00075f0a0007000d5f070006000f5f06000500025f01570e5f05000500015f0157065f01e5085f05000400015f0157075f01e5095f04000400015f0157075f01e5095f04000400015f0157075f01e5095f04000400095f01e5095f04000400095f01e5095f04000400095f01e5095f040002000222095f01e5095f022202000422095f01e5095f042201000322095f0182095f0322010002000322055f0382095f02220300040002220f5f02220400060002220b5f02220600" + }, + { + "filename": "33-okayama-pheasant-heads", + "data": "0x0003191506019212000292110005920a540400010002920d54030002000f540200020002540601016a05010154020002000701036a0501020002000701010f016a010f05010200020002010cb901010200020001540eb90200020001540eb90200020001540eb90200020001540eb90200020001540eb902000200025407b9036d03b9020003000754096d03000854086d03000e540100016d03000e1d0200" + }, + { + "filename": "34-hiroshima-manju-choco-heads", + "data": "0x00031a1507090001ad0900080003ad0800070002ad018802ad0700060002ad038802ad0600050002ad02880185028802ad0500040002ad02880385028802ad0400010005ad01880585028804ad0100010001ad05880585058801ad0100010001ad01880d85018801ad0100010001ad02880b85028801ad0100020001ad01880b85018801ad0200020001ad02880985028801ad0200020001ad01880b85018801ad0200010002ad01880b85018802ad010002ad01880d85018802ad010002ad0188038504980485018802ad0100020002ad02880785028802ad0200030002ad098802ad0300040003ad010003ad010003ad0400" + }, + { + "filename": "34-hiroshima-manju-custard-heads", + "data": "0x00031a1507090001ad0900080003ad0800070002ad018802ad0700060002ad038802ad0600050002ad0288016d028802ad0500040002ad0288036d028802ad0400010005ad0188056d028804ad0100010001ad0588056d058801ad0100010001ad01880d6d018801ad0100010001ad02880b6d028801ad0100020001ad01880b6d018801ad0200020001ad0288096d028801ad0200020001ad01880b6d018801ad0200010002ad01880b6d018802ad010002ad01880d6d018802ad010002ad0188036d04e4046d018802ad0100020002ad0288076d028802ad0200030002ad098802ad0300040003ad010003ad010003ad0400" + }, + { + "filename": "34-hiroshima-manju-koshi-heads", + "data": "0x00031a1507090001ad0900080003ad0800070002ad018802ad0700060002ad038802ad0600050002ad02880180028802ad0500040002ad02880380028802ad0400010005ad01880580028804ad0100010001ad05880580058801ad0100010001ad01880d80018801ad0100010001ad02880b80028801ad0100020001ad01880b80018801ad0200020001ad02880980028801ad0200020001ad01880b80018801ad0200010002ad01880b80018802ad010002ad01880d80018802ad010002ad0188038004450480018802ad0100020002ad02880780028802ad0200030002ad098802ad0300040003ad010003ad010003ad0400" + }, + { + "filename": "34-hiroshima-manju-maccha-heads", + "data": "0x00031a1507090001ad0900080003ad0800070002ad018802ad0700060002ad038802ad0600050002ad0288010f028802ad0500040002ad0288030f028802ad0400010005ad0188050f028804ad0100010001ad0588050f058801ad0100010001ad01880d0f018801ad0100010001ad02880b0f028801ad0100020001ad01880b0f018801ad0200020001ad0288090f028801ad0200020001ad01880b0f018801ad0200010002ad01880b0f018802ad010002ad01880d0f018802ad010002ad0188030f045c040f018802ad0100020002ad0288070f028802ad0200030002ad098802ad0300040003ad010003ad010003ad0400" + }, + { + "filename": "34-hiroshima-manju-tsubu-heads", + "data": "0x00031a1507090001ad0900080003ad0800070002ad018802ad0700060002ad038802ad0600050002ad02880185028802ad0500040002ad028802850180028802ad0400010005ad01880145028501450185028804ad0100010001ad0588024501800285058801ad0100010001ad018802800245018502800385018001450185018801ad0100010001ad02880180018501450480018501800285028801ad0100020001ad018802850380018501450480018801ad0200020001ad0288018501450280024502800145028801ad0200020001ad018801850345028502800345018801ad0200010002ad01880180034502800185028001450185018802ad010002ad018802850145078001450285018802ad010002ad0188028501800445018501800285018802ad0100020002ad02880180014502800385028802ad0200030002ad098802ad0300040003ad010003ad010003ad0400" + }, + { + "filename": "34-hiroshima-okonomiyaki-heads", + "data": "0x00051b14050500015d0300045f0100019307000600025d01d9015f026a0122015d08000600012201d90101026a0122010101220800030001930101010001d90101015f016a015d0101015d01010122015f010105000500010101d90101015f016a0122015d010101220101025f010104000500012201d90101015f016a015d022201010122015d015f01d9010103000400015f015d01d90101015f016a0422015d0122015f02d9010102000300015f015d012201d90101015f016a0622015f02d9010102000200016a015f022201d90101015f016a0622015f02d9010102000200016a015f022201d90101015f016a0622015f02d9010102000200016a015f022201d90101015f016a0622015f02d9010102000200016a015f022201d90101016a0722015f02d9010102000200016a015f0c22015f02d9010102000200026a015f0f22020002000560012501600125016001250160012501600125046002001623" + }, + { + "filename": "34-hiroshima-shrine01-heads", + "data": "0x00051c15050277130002770100157701000200131a020002001341020004000441020003230200044104000500021a03000123019301230300021a0500040004410200032302000441040002001341020002001341020005000241090002410500040003b3090003b30400050001b301410900014101b30500050001b301410900014101b30500050001b301410900014101b30500050001b301410900014101b305000400018d01b30141038d0306038d014101b305000400078d0106068d0500" + }, + { + "filename": "35-yamaguchi-anglerfish-heads", + "data": "0x00091f15020c0005830c000900048301660683090008000a830266018308000100013403000f83016603830300013401000234020002830266118302000234033402830166068301230383012309830334023402830166118301660483023401000134098307090483016604830134010002000283016603830d0906830200030004830109035f0166055f0166035f01090483030004000283010901660d5f0166010902830400040001830109018302090166015f0166015f0166015f0166015f0166015f0166020901830109050009000b090900" + }, + { + "filename": "35-yamaguchi-footballfish-heads", + "data": "0x00031f15020900023402eb100008000134040001eb01da0e0007000134050001da015d01da0d0007000134040001da015d0101015d01da0c0008000134040001da015d01da0d000900023401eb020001da0e000c0002eb03830c0009000483016601eb0583090008000683013403830266018308000100013403000f83016603830300013401000234020002830266118302000234033402830166068301230383012309830334023402830166118301660483023401000134098307090483016604830134010002000283016603830d0906830200030004830109035f0166055f0166035f01090483030004000283010901660d5f0166010902830400040001830109018302090166015f0166015f0166015f0166015f0166015f0166020901830109050009000b090900" + }, + { + "filename": "35-yamaguchi-fuku-heads", + "data": "0x00051b14030400026212000400036211000400046203610495016105950300050001950361039501590395016101950126012301260195020001610300029502610395015901610159016103950326029501ed0261069501610195015903610159016101950161049501ed0100026102950161029501610195016101590361015901950161059502ed02610301016103950161015903610159016105950201010002610401059501590161015904950501010001610300130101000200026212010200020003621101020002000262010011010200060008010259050103000600080101590601030007000d010400" + }, + { + "filename": "35-yamaguchi-kawarasoba-heads", + "data": "0x00051e1504030001061600010002060700015503000155080001060200010609000155030001550900010601000106080001da010101da010001da010101da05000306020001000306040001d0012301d0012301d0012301d0012301d00900040001060200011501230115012301150123011501230115012301150200010605000400010601000d1503000206020001000306010001eb01e601eb01e601eb01e603eb01e601eb01e601eb01e601eb0400010601000106040001eb01e601eb01e601eb01e603eb01e601eb01e601eb01e601eb05000106010604000fe80300020601000100010603000fe802000106030002000106010011e8010001060300040002e80d2302e80200010602000300010c02230d0c0223010c04000200040c0d00030c01230200010c0200020c1100020c0223010c0200010c1300030c0100" + }, + { + "filename": "35-yamaguchi-shoin-heads", + "data": "0x00031715070100030c0c000200050c09000400060c060002000d23010001000f2301000223048805230388012302230e8802230e8802230388032304880323018801230f880588032304880323018806880123028801ca0288012303880a8801ca05880a8801ca05880200088801ca05880200058802ca018801ca018801ca03880200048801ca028802ca028801ca028803000c880100050009880200" + }, + { + "filename": "36-tokushima-awa-odori01-heads", + "data": "0x000118140d010002d80800010004d8030001880200010006d8010001880200010007d801060200020005d80106020001880200012303880106030001880300038803000101010001000301026703010200040102670101040003010367050003890367050002e201890367050004e2014f060002e2044f05000200044f050001000155044f050001000355014f06000300010107000200010108000200012301550700" + }, + { + "filename": "36-tokushima-naruto-wakame-heads", + "data": "0x00021a15070b000194035c04940b000348035c02480b00035c0100025c02000b00035c0200015c020004000748035c01480400020002480723035c012302480200010001480923025c0423014801000148042306de015c02de042301480148022302e90bde022301480148012304e905de015c05de01230148014807de045c06de0148014805de055c07de0148014806de035c03de02e903de014801480bde04e902de0148014811de014802480fde0248034801de055c07de034801001148010002000f48020004000b480400" + }, + { + "filename": "36-tokusima-whirlpools-heads", + "data": "0x00011d15030800010111000700010101300101058d040001010600090001300601020001010130010105000600018d0300073002000130010105000500018d010102300801018d02000130018d04000400018d01010130018d0101088d0101028d01300101018d030001000101028d0101013001010130038d0530028d0101028d01300101018d0200010101000201023001010130018d013006010130028d0101028d013001010200040002010130028d01010330028d02010130028d0101018d01300300040001010130018d013001010130068d02010130028d010101300300030001010130018d013001010130028d0401028d02010130018d010101300300020002010130018d01010130028d0101038d0201018d02010130018d0101013003000100010101000130028d01010130018d0101028d0101028d0101028d01010130018d01010130020101000100010101000101028d01010130018d0101018d0101038d0101028d01010130018d010101300101010001010100010102000101018d01010130018d0101028d0101018d0101038d01010130018d010101300200010102000201038d0130018d0101078d01010130018d010101300100020101000400018d0101018d0130018d01300101058d01010130028d01010130010103000500013001010130028d013005010130028d0101018d01300101030005000130018d01010130028d0530028d0101018d0130010104000600023002010130058d0201018d0130010105000a0006010a00" + }, + { + "filename": "37-kagawa-bonsai-heads", + "data": "0x00021d14040900071b09000700051b020f031b08000600010f041b040f031b07000500030f011b070f011b0200040f02000400070f04ca0300010f041b02000400050f04ca020f011b02ca031b030f01000b0001ca020f031b0200011b040f01000700031b010f0100010f051b07000600051b010f030003ca07000500031b03ca010f020004ca0100051b01000200021b030001ca030009ca031b020f0100011b020f011b010001ca050004ca0300011b02ca030f011b040f02ca040003ca0500020f0100020f0100060f040003ca0c00090005ca0b00090007ca09000600015401010354048c045406000600015401010b54060007000154010109540700" + }, + { + "filename": "38-ehime-iyokan-heads", + "data": "0x00051a140604000c4204000200084201e1074202000100024201250f42010002420125114201420125124201420125124214421442144214421442144214420100054203b30a42010002001042020003000e420300" + }, + { + "filename": "38-ehime-jakoten-heads", + "data": "0x0006191406020010d20100010001d203d102d2018e0bd201d204d10ed201d204d101d2018e0ad2018e01d201d204d106d2018e07d201d204d10ed201d204d10ed201d204d10ed201d204d10ed201d204d10dd2018e01d204d10ed201d204d105d2018e01d2018e06d201d204d10ed2010001d203d101d2038e08d2018e01d2020010d20100" + }, + { + "filename": "38-ehime-mandarin-orange-heads", + "data": "0x00061a140604000c4204000200084201e1074202000100024201250f4201000242012511420142012512420142012512421442144214421442144214420100054203b30a42010002001042020003000e420300" + }, + { + "filename": "38-ehime-onsen01-heads", + "data": "0x00031b15050700015504000155040001550400060002550300025503000255040005000255030002550300025505000400025503000255030002550600040002550300025503000255060004000255030002550300025506000400025503000255030002550600050002550300025503000255050006000255030002550300025504000200025502000255030002550300025501000155020001000255030002550300025503000255010002550100025503000255030002550300025503000255025502000255030002550300025504000255025502000155040001550400015505000255025512000255035510000355010003550e000355010002001255020004000e550400" + }, + { + "filename": "38-ehime-onsen02-heads", + "data": "0x00031b150507000101040001010400010104000600020103000201030002010400050002010300020103000201050004000201030002010300020106000400020103000201030002010600040002010300020103000201060004000201030002010300020106000500020103000201030002010500060002010300020103000201040002000374013f0201033f0201033f02010274020001000274033f0201033f0201033f0201013f027401000274033f0201033f0201033f0201033f02740274023f0201033f0201033f0201043f02740274023f0101043f0101043f0101053f02740274123f02740374103f0374010003740e3f0374010002001274020004000e740400" + }, + { + "filename": "38-ehime-onsen03-heads", + "data": "0x00031c14050b00010c0b000900050c09000800016101740161017401610174016108000700017407de01740700020001610300016101de01ae05de01ae01de0161030001610200030001740161017401de04ae01de04ae01de0174016101740300030003de03ae053f03ae03de0300060003ae013f02e70126013f03ae0600060003ae053f03ae060006000bae060006000b3f0600013f03000f3f0300013f0100153f010002001321020004000f01040002000157010004ae015702ae015702ae015704ae0100015702000200010c010001ae0306015701ae033601ae0157030601ae0100010c02000200010c010001ae030602ae033602ae037401ae0100010c0200" + }, + { + "filename": "38-ehime-tai-somen-heads", + "data": "0x00031c18010d000189020001890a000b0001890100015f01890100015f0189090008000357015f01890157015f01890157015f018902570600070003570b20015705000600025701890e200400050002570189102003000500015701890320018d0220018d0220018d0220018d0520020001200300025714200100010001200200015715200100010001890120010001571220028d01200100020001891320018d0101012302200200012001890c200389042001010123022002000189012002060b20038907200100018901200100015703060a200389032003090100012002000157018904060a20010603200306012003000257018907060401080601000400035712060200040004570f06040004000157010002570400068904000157040004000157010001570f000157040004000157110001570400040001571600" + }, + { + "filename": "38-ehime-taimeshi-heads", + "data": "0x00041a16060600082306000300030f0848022304000200050f01e90182020101e9015f01010248012303000100060f02e9018202e90182010101e901010148012302000100030f0282015f02e9015f02e9015f02e9015f01010148012301000100020f03e90182015f01e9018201e9028202e9018201010148012301000123020f04e9018201e9015f01e9015f02e9025f02010148012301230148030f03e9044202e9028202e901480123012301480201025f0182044201010142015f04e90148012301230148015f028202e9044201e4014204e9015f0148012301230148018203e9015f064202e9015f01820101014801230123014803e9015f018201e9044201e9015f02820201014801230123014802e9015f018201e9018201e90101018204e90301014801230100012301480101018202e9018202e90182015f04e901010148012301000100012301480101018201e90101015f03e90182015f018202e9010101480123010002000123014803010182015f03e901010282010101480123020003000123024802010182015f02e9020102480123030004000223084802230400060008230600" + }, + { + "filename": "39-kochi-bonito-heads", + "data": "0x00041d15020f0001260b00100001260a000f0002260a0006000126070003260a0007000126040006260900060002260c54070006001054050005000354065601540556045403000154030003540f56035402000156015401000154025606540a56010101230254010002560100035610060201025601540106025616060296025601001506019602e901560154020003e9015412e901000154040003e9095408e90200060012e90300060002260ee90500050001260b0002260800" + }, + { + "filename": "40-fukuoka-mojiko-heads", + "data": "0x00031e14030d0001960d0009000196030001960300019609000600019602000196072701960100019607000600019602000927010001960700060002610b27026106000500046102270106016b010101270106022704610500050001a501e0010601a5032701a501aa01a5032701a501e0010601a50500040009aa015709aa0400050001c1025701c1025701e9035701e9025701c1025701c105000200032701c1015701e001c102e001e903e001e902e001c1015701e001c1032702000100042701c1015701e001c101e0010601e901e0010601e001e901e0010601c10157010601c1042701000100042701c10157010601c1020601e901e0020601e9020601c10157010601c104270100052701c1029c01c1099c01c1029c01c1052701e00106019c01e0010601c1025701c1025701e9035701e9025701c1025701c101e00106019c01e00106052701c1015701e001c10103036f016d036f010301c1015701e001c10527015701e00106015701e001c10157010601c1016d01970146039701460197016d01c10157010601c101e0015701e001060157015702060157010601c10157010601c1010301460197034601970146010301c10157010601c101060157020601570557017f0257017f0103019701460397014601970103017f0257017f0557" + }, + { + "filename": "40-fukuoka-tenmangu-heads", + "data": "0x00031e14021b0001660100016a170001660200040013080500016a0400020801c4020801c4020801c4020801c4020801c402080500016604000185010801b80d8501b8010801850500026a0200028501b805850398058501b80285030002660129016a0200028501b804850584048501b802850300012901660400028501b80385028403bf0284038501b8028505000200048501b80185038401bf03c401bf0384018501b8048503000200061804bf017701c4017704bf061803000300031804a201bf017703bf017701bf04a2031804000300011801eb011802eb011801eb01bf011803eb011801bf01eb011802eb011801eb011804000300011801b5011802b5011801b501bf011803b5011801bf01b5011802b5011801b5011804000300011801b5011802b5011801b501bf011803b5011801bf01b5011802b5011801b5011804000300071801bf051801bf0718040003000118010d0118020d0118010d01bf0118030d011801bf010d0118020d0118010d011804000200019d026f029d026f029d026f029d026f029d026f019d026f019d03000600016f029d026f029d026f029d026f029d016f0600" + }, + { + "filename": "41-saga-mudskipper-fiddlercrab-heads", + "data": "0x0002181502070003610c0005000361028d0c0004000261018d036105000278050004000161018d0361018d0305018d0105017801920105040003000461018d01610105018d0805030003000161018d0161018d0705018d02050292030001000161018d020001610205018d0305018d0305029204000361018d01000c050500018d0161018d01610205018d0305018d020501d7010507000361090506d70400018d0161018d0105018d0205018d0205030004d705000361060501d7040002d70600018d0161018d060501d70c0001000261018d0105018d030502d70b000100018d02610405018d02d70b0002000161018d0205018d030502d70400019201000192020001a10200018d0161018d0305018d030503000149017801000178010002090300018d0161018d03000305018d0300047502090900018d0361018d0200047502000a000161028d0200017501000275010001750100" + }, + { + "filename": "41-saga-yoshinogari-heads", + "data": "0x0002181409030001d8010001d8010001d8010001d8010001d80300040007d80400030009c9030002000bd8020001000dc9010002000b99020001000d9901000f99010001bb050001bb050001bb010001de01bb050001bb050001bb01de0fde01de01bb050001bb050001bb01de0fde010001bb050001bb050001bb0100010001bb050001bb050001bb0100010001bb050001bb050001bb010001000dbb0100010001bb050001bb050001bb0100010001bb050001bb050001bb0100" + }, + { + "filename": "42-nagasaki-champon-heads", + "data": "0x00071a1406060008e00600040003e0065703e00400020003e00257066d025703e00200010002e00157032d01d4014e02eb0166012d026d025702e0010002e00257036602eb02d40166012d014e02d4025702e001e00257014e05d4014e01970166012d02d4026d025701e001e00157016d024e01d402eb02d4019702d402eb014e0297015701e001e0015702eb0266039703660197024e032d015701e002e00157032d02d401eb032d019701eb01d4036602e0010002e0016d01eb024e05d4019701eb014e036d01e001000100016f03e0015702d401b3016d02eb016d025703e0016f01000200026f03e0015701cd01b301cd025703e0026f02000300036f08e0036f030004000c6f0400" + }, + { + "filename": "42-nagasaki-meganebashi-heads", + "data": "0x00081a13060200100802000408017e0108017e0608017e0108017e04080208017e0400017e0408017e0400017e020802080600017e0208017e060002080108017e060004080600017e0108017e080002080800017e019108000291080001910191080002910800019102910700039107000191010003910300029102000391030002910100030004910600049103000700019101000191010001910800" + }, + { + "filename": "42-nagasaki-saseboburger-heads", + "data": "0x00071c1504030002c2042b01c2032b01c2012b01c2032b02c20300020014c20200020014c2020002000393031c0593011c0493021c029302000100151c0100011c011c0100031c0e55041c010006000ee0011c0300040007e009e50400020009e5099302e50200010002e502da01010dda010102da01e5010001e503da010101da01010bda010101da010102da0100020014970200020007550585065504000200019301c2015501c2045508c2015502c201930200030012930300" + }, + { + "filename": "43-kumamoto-karashirenkon-heads", + "data": "0x00051a1505060009c60600040002c609d402c60400020002c606d401c606d402c60200010001c604d401c602d403c602d401c604d401c60100010001c602d404c601d403c601d404c602d401c6010001c604d403c602d401c602d403c604d401c601c605d401c607d401c605d401c601c602d402c60bd402c602d401c601c601d404c604d401c604d404c601d401c601c602d402c60bd402c602d401c601c605d401c607d401c605d401c601c604d403c605d403c604d401c6010001c602d404c605d404c602d401c60100010001c604d401c602d403c602d401c604d401c60100020002c605d402c606d402c60200040002c609d402c60400060009c60600" + }, + { + "filename": "43-kumamoto-kumamotocastle-heads", + "data": "0x00021d15020800019d12000700019d0101019d11000600059d10000600050e1000040002c80206019d020602c80e00040002c8029d0101029d02c80e00030002c8029d0323029d02c80d0003000501019d05010800019d04000300010e0223010e019d0101019d010e0223010e0700019d0101019d0300020001c8036f019d0323019d036f01c8060003060300020001c8020e019d0101030e0101019d020e01c8039d03c8019201230192030002c8019d0c6f02c8039d01c8036f01c802000100019d0101019d0c01026f020101c80192019d019202c8010001000392010e0623010e0223020e029201230192019d0301019d01010100010003920c0e0492052301920100059d012301010123010101230101012301010123010101230a92010005010159025e0659015e02cf01ef015e030e01cf01ef02cf0100020e0392015e0259015e0159025e0159015e025901ef01cf0159030e01ef02cf01ef01cf020e03920159015e0859015e015901cf025e020e01cf02ef02cf025e01cf01ef01cf015e0159025e0159015e0159025e0259015e0259015e0159010e01ef02cf02ef" + }, + { + "filename": "44-oita-beppujigoku-heads", + "data": "0x00021c17030a00027f0100017f0b000800027f0f000700017f0300017f0d000700017f0300017f0200039b0230019b05000700037f0500063004000300029d0500017f0e000200049d0300017f0100027f060001570100015703000200019d01c8019d01c80300017f0300017f0400055702000100069d0300017f0200017f0400056f02000c00017f0500016f0100036f020019000100023e0100023e0500017f070003520300063e030001ee027e01ee017e01ee020002520600033e0105023e020003a701ee02a7030001520100045201230100063e0c0005520238010002c1023e0300010101060f00060001010100010101060f000800010101060101020006bf06000600010101000101010601000106020006bf0500080001010106070001bf010001bf05001900110001bf010001bf0500" + }, + { + "filename": "44-oita-usajingu-heads", + "data": "0x00031e1501070001b80d0001b8070007000fb80700060011b80600050013b80500060002bf01b402bf01b402bf01b402bf01b402bf01b402bf0600070001bf01b4020101b4020101b4020101b4020101b401bf0700020006b8016d02bf016d05bf016d02bf016d06b80200020006b801bf020101bf010103bf010101bf020101bf06b80200020006b801bf020101bf010103bf010101bf020101bf06b80200020004b802bf01b402bf01b402bf01b402bf01b402bf01b402bf04b80200010006b801bf01b402bf01b402bf01b402bf01b402bf01b401bf06b80100010007b801bf020101bf020101bf020101bf020101bf07b8010007b80101016d02bf016d05bf016d02bf016d010107b80200010101bf01dd010f01dd010f01bf01dd010f01bf01dd010f01bf01dd010f01bf01dd010f01bf01dd010f01dd010f01bf010102000200010d01bf01dd010f01dd010f01bf01dd010f01bf01dd010f01bf01dd010f01bf01dd010f01bf01dd010f01dd010f01bf010d02000200010101bf01dd010f01dd010f01bf01dd010f01bf01dd010f01bf01dd010f01bf01dd010f01bf01dd010f01dd010f01bf0101020002000101016d0401016d02bf016d01dd010f01bf01dd010f016d02bf016d0401016d0101020001000dbf016d0dbf0100030005bf016d02bf016d05bf016d02bf016d05bf0300" + }, + { + "filename": "45-miyazaki-aoshima-heads", + "data": "0x00061d14030500109205000600027f0192047f0192047f0192017f0600080001bf040001bf040001bf0700010001e1020001e110bf050001e1010001e1010001e1010001e1010001bf090001bf070001e1010002e1010001e1020001bf090001bf0700010004e1010002e101bf090001bf070001e1010002e1021b02e101bf0192080001bf01920600030005e102bf080002bf0600030003e1011b019202bf010006af019202bf0600020002e1011b02e103bf07af03bf01d6026001d60260020003e101c801e102bf019207af02bf0192029902210299010003e1011b019d01e101bf019208af01bf0192016002d6026001d60100010001e1011b02e1019d01e1019209af019201af01990221039901000100011b03e1019d0caf01d6026001d6016001d60200" + }, + { + "filename": "45-miyazaki-chickennanban-heads", + "data": "0x00061a14040800078707000600038701790787050004000a8701790487030004000287017902870179028701790587029c02000200029c0c87059c01000100029c0c87079c0100029c0187017903870179028701790287089c0100029c0a87099c029c0a870a9c029c08870c9c0100029c018701790287017901870c9c01000100029c05870d9c01000200029c028701790187029c0111099c02000200029c0387049c0311069c020005000e9c0300" + }, + { + "filename": "46-kagoshima-goromon-heads", + "data": "0x00051e1502080001a50b0001a50700070001a50d0001a506000600112105000500022101950121019501210195012101950121019501210195012101950121019502210400040001210195012101950121019501210195012101950121019501210195012101950121019501210195012103000500067f0121019501210195012101950121067f040007000f7f060007000554057f05540600050004210354057f055406000500012101950121019501210195012101950121019501210195012101950121019501210195012104000400022101950121019501210195012101950121019501210195012101950121019501210195022103000500017f018a037f018a027f018a017f018a027f018a0195027f018a017f0400020001d702050dca0195017f019503ca01d7020501d70200010503d701ca035001ca015001ca030001ca059501ca01d7010502d70100010004d7010501ca035001ca015001ca030001ca0150038a015001ca04d70100010002d7020502d701ca025001ca018a01ca030001ca048a01ca02d70205020001d7010504d7010501ca025001ca018a01ca030001ca048a01ca010503d70200" + }, + { + "filename": "46-kagoshima-shirokuma-heads", + "data": "0x00011914060400030f0c000700010f0271090007000271010101710800020001c00300010104710201020001c00300020002c004010271050101c00300020001c0020101e4060101b7030103000200010102e4030101b7060102b902000100020102e40a0102b9010101000100030102e40201017109010100010102650401017101ba0171020102da0501010102650f0101000100120113010106110101060106017f0f06017f01060106117f0106010001060f7f0106010002000106047f0401057f0106020003000206097f02060300050009060500" + }, + { + "filename": "47-okinawa-goya-chanpuru-heads", + "data": "0x00061915070600018702a2018701a2018706000400018701a20187016d010f018701a2028701a20400030001a20187020f0201020f018703a2030002000287010f01380222010f0122016d01380122010f02870200010002a201010138026d010f012202010138016d0122010f01a20187010001a202870201016d010f02380101010f020102a20287010002a2020f0122010f01010122020f0122010f016d010f012203870287012201380122010f0101016d0122016d0122010f016d0138010f016d018701a2028701220101010f016d013802010122033801010122020f01a20287016d0201022201380201020f026d0101022201a2010001a2010f01220138020f0101026d0222010f01220187010f018701000100018701a2013801220201016d0122010f0201016d01220138018701a2010002000287010f01010438010f0222010f0287020003000287010f0438010f0122010f02a20300040002a20187016d0122010f01a2038704000600028702a202870600" + }, + { + "filename": "47-okinawa-shuricastle-heads", + "data": "0x00051e1403050001d00f0001d00500050002c40d0002c40500050001a101be01a101be01a101be01a101be01a101be01a101be01a101be01a101be01a10500050001a101be01a101be01a101be01a101be01a101be01a101be01a101be01a101be01a10500040001be01d001be01a101be01a101be01a101be01a101be01a101be01a101be01a101be01d001be0400020001be01a101be01a101be01a101be01a101be01a101be01c401be01a101be01a101be01a101be01a101be01a101be020004000848035408480400020001be01a101be01a101be01a101be01a1024d01a601be01a6024d01a101be01a101be01a101be01a101be020001be01a101be01a101be01a101be01a101be014d02a6039202a6014d01be01a101be01a101be01a101be01a101be0200044801be01a1014d01a601d0029201d0029201d001a6014d01a101be0448020002000148013301480133014801330148094d0148013301480133014801330148020002000748014d010101a603be01a60101014d074802000200014801010548014d0101014d0301014d0101014d02480201014801010148020002000148010104480105014d01be01a603be01a601be014d0105014802010148010101480200010007970105014d01be014d03be014d01be014d010507970100019707ee01d7095901d707ee0197" + }, + { + "filename": "47-okinawa-siisa-heads", + "data": "0x00041d14030200033706000437060003370200030004370200033702000337020004370300040008370200083704000300023703460137034602370246023702460337030003000237026602370266043701230337012303370300020001460237016601230237016601230337012301370123013701230137012302370146020001000246143702460100020001460337042307370423023701460200010003460837024606370123013702460200030002460637014602000146063702460300030002370746020007460237030001000146010003370246023701460137020001370146023702460337010001460100024601000937020009370100024601460b3702000b37014601000a370123020001230a3701000200013701460837022308370146013702000400023701660200023701660200016602370200016602370400" + } + ], + "glasses": [ + { + "filename": "glasses-hip-rose-glasses", + "data": "0x000b1710070300062001000620030001200201022301200100012002010223012004200201022303200201022301200420020102230320020102230120012002000120020102230120010001200201022301200300062001000620" + }, + { + "filename": "glasses-square-black-eyes-red-glasses", + "data": "0x000b17100703000623010006230300012302010264012301000123020102640123042302010264032302010264012301230200012302010264012301000123020102640123012302000123020102640123010001230201026401230300062301000623" + }, + { + "filename": "glasses-square-black-rgb-glasses", + "data": "0x000b171007030006230100062303000323016402230100032301640223102301230200012301650223015a01230100012301650223015a0123012302000623010006230300062301000623" + }, + { + "filename": "glasses-square-black-glasses", + "data": "0x000b171007030006230100062303000123020103230100012302010323042302010523020103230123020001230201032301000123020103230123020001230201032301000123020103230300062301000623" + }, + { + "filename": "glasses-square-blue-med-saturated-glasses", + "data": "0x000b17100703000643010006430300014302010223014301000143020102230143044302010223034302010223014301430200014302010223014301000143020102230143014302000143020102230143010001430201022301430300064301000643" + }, + { + "filename": "glasses-square-blue-glasses", + "data": "0x000b17100703000607010006070300010702010223010701000107020102230107040702010223030702010223010701070200010702010223010701000107020102230107010702000107020102230107010001070201022301070300060701000607" + }, + { + "filename": "glasses-square-frog-green-glasses", + "data": "0x000b171007030006c0010006c0030001c00201022301c0010001c00201022301c004c00201022303c00201022301c001c0020001c00201022301c0010001c00201022301c001c0020001c00201022301c0010001c00201022301c0030006c0010006c0" + }, + { + "filename": "glasses-square-fullblack-glasses", + "data": "0x000b1710070300062301000623030004230101012301000423010101230723010106230101012301230200062301000623012302000623010006230300062301000623" + }, + { + "filename": "glasses-square-green-blue-multi-glasses", + "data": "0x000b1710070300060f0100068b0300010f02010223010f0100018b02010223018b034a010f02010223010f014a018b02010223018b018b0200010f02010223010f0100018b02010223018b018b0200010f02010223010f0100018b02010223018b0300060f0100068b" + }, + { + "filename": "glasses-square-grey-light-glasses", + "data": "0x000b171007030006c8010006c8030001c80201022301c8010001c80201022301c804c80201022303c80201022301c801c8020001c80201022301c8010001c80201022301c801c8020001c80201022301c8010001c80201022301c8030006c8010006c8" + }, + { + "filename": "glasses-square-guava-glasses", + "data": "0x000b17100703000637010006370300013702010223013701000137020102230137043702010223033702010223013701370200013702010223013701000137020102230137013702000137020102230137010001370201022301370300063701000637" + }, + { + "filename": "glasses-square-honey-glasses", + "data": "0x000b171007030006de010006de030001de0201022301de010001de0201022301de04de0201022303de0201022301de01de020001de0201022301de010001de0201022301de01de020001de0201022301de010001de0201022301de030006de010006de" + }, + { + "filename": "glasses-square-magenta-glasses", + "data": "0x000b17100703000609010006090300010902010223010901000109020102230109040902010223030902010223010901090200010902010223010901000109020102230109010902000109020102230109010001090201022301090300060901000609" + }, + { + "filename": "glasses-square-orange-glasses", + "data": "0x000b17100703000614010006140300011402010223011401000114020102230114041402010223031402010223011401140200011402010223011401000114020102230114011402000114020102230114010001140201022301140300061401000614" + }, + { + "filename": "glasses-square-pink-purple-multi-glasses", + "data": "0x000b171007030006200100069a030001200201022301200100019a02010223019a036e0120020102230120016e019a02010223019a019a020001200201022301200100019a02010223019a019a020001200201022301200100019a02010223019a030006200100069a" + }, + { + "filename": "glasses-square-red-glasses", + "data": "0x000b17100703000624010006240300012402010223012401000124020102230124042402010223032402010223012401240200012402010223012401000124020102230124012402000124020102230124010001240201022301240300062401000624" + }, + { + "filename": "glasses-square-smoke-glasses", + "data": "0x000b17100703000659010006590300015902660223015901000159026602230159045902660223035902660223015901590200015902660223015901000159026602230159015902000159026602230159010001590266022301590300065901000659" + }, + { + "filename": "glasses-square-teal-glasses", + "data": "0x000b1710070300061c0100061c0300011c02010223011c0100011c02010223011c041c02010223031c02010223011c011c0200011c02010223011c0100011c02010223011c011c0200011c02010223011c0100011c02010223011c0300061c0100061c" + }, + { + "filename": "glasses-square-watermelon-glasses", + "data": "0x000b17100703000637010006370300013702010223013701000137020102230137043702010223033702010223013701370200013702010223013701000137020102230137013702000137020102230137010001370201022301370300063701000637" + }, + { + "filename": "glasses-square-yellow-orange-multi-glasses", + "data": "0x000b17100703000626010006130300012602010223012601000113020102230113034201260201022301260142011302010223011301260200012602010223012601000113020102230113012602000126020102230126010001130201022301130300062601000613" + }, + { + "filename": "glasses-square-yellow-saturated-glasses", + "data": "0x000b17100703000628010006280300012802010223012801000128020102230128042802010223032802010223012801280200012802010223012801000128020102230128012802000128020102230128010001280201022301280300062801000628" + } + ] + } +} \ No newline at end of file diff --git a/contract/test/localNouns.ts b/contract/test/localNouns.ts index 6052aeb0..931505ac 100644 --- a/contract/test/localNouns.ts +++ b/contract/test/localNouns.ts @@ -4,7 +4,7 @@ import { addresses } from '../../src/utils/addresses'; import { ethers } from 'ethers'; import { abi as sampleTokenAbi } from "../artifacts/contracts/sampleToken.sol/sampleToken"; -let owner: SignerWithAddress, user1: SignerWithAddress, user2: SignerWithAddress, user3: SignerWithAddress, user4: SignerWithAddress, user5: SignerWithAddress, admin: SignerWithAddress; +let owner: SignerWithAddress, user1: SignerWithAddress, user2: SignerWithAddress, user3: SignerWithAddress, user4: SignerWithAddress, user5: SignerWithAddress, admin: SignerWithAddress, developper: SignerWithAddress; let token: Contract, minter: Contract, provider: Contract, tokenGate: Contract, sampleToken: Contract; const nounsDescriptorAddress = addresses.nounsDescriptor[network.name]; @@ -13,6 +13,8 @@ const nounsSeederAddress = addresses.nounsSeeder[network.name]; const localSeederAddress = addresses.localSeeder[network.name]; const sampleTokenAddress = addresses.sampleToken[network.name]; +const zeroAddress = '0x0000000000000000000000000000000000000000'; + before(async () => { /* `npx hardhat node`実行後、このスクリプトを実行する前に、Nouns,LocalNounsの関連するコントラクトを * デプロイする必要があります。(一度実行すると、node停止までは再実施する必要なし) @@ -22,9 +24,16 @@ before(async () => { # npx hardhat run scripts/deploy_localNouns.ts # npx hardhat run scripts/populate_localNouns.ts # npx hardhat run scripts/deploy_sample.ts + + note: `npx hardhat node`実行時にJavaScript heap out of memory が発生した場合は環境変数で使用メモリを指定する + export NODE_OPTIONS=--max-old-space-size=4096 + + # テスト実行 + # npx hardhat test test/localNouns.ts + */ - [owner, user1, user2, user3, user4, user5, admin] = await ethers.getSigners(); + [owner, user1, user2, user3, user4, user5, admin, developper] = await ethers.getSigners(); const factoryTokenGate = await ethers.getContractFactory('AssetTokenGate'); tokenGate = await factoryTokenGate.deploy(); @@ -61,10 +70,10 @@ describe('mint functions', function () { it('mint from non-minter', async function () { await expect(token.connect(user1).functions.mint()) - .revertedWith('Cannot use this function'); + .revertedWith('Cannot use'); await expect(token.connect(user1).functions.mintSelectedPrefecture(user1.address, 1, 1)) - .revertedWith('Sender is not minter nor owner'); + .revertedWith('Invalid sender'); await expect(token.connect(user1).functions.ownerMint([user1.address], [1], [1])) .revertedWith('Ownable: caller is not the owner'); @@ -88,14 +97,14 @@ describe('mint functions', function () { it('Invalid prefectureId', async function () { // OKパターンは別テストで実施 - const txParams = { value: ethers.utils.parseUnits("0.003", "ether") }; + const txParams = { value: ethers.utils.parseUnits("0.03", "ether") }; await expect(minter.connect(user4).functions.mintSelectedPrefecture(48, 1, txParams)) .revertedWith('Invalid prefectureId'); }); it('mint from minter', async function () { - const txParams = { value: ethers.utils.parseUnits("0.001", "ether") }; + const txParams = { value: ethers.utils.parseUnits("0.01", "ether") }; await minter.connect(user1).functions.mintSelectedPrefecture(0, 1, txParams); const [balance] = await token.functions.balanceOf(user1.address); @@ -108,7 +117,7 @@ describe('mint functions', function () { expect(totalSupply.toNumber()).to.equal(1); // tokenId=1 const [traits1] = await provider.functions.generateTraits(0); - console.log('mint from minter', traits1); + // console.log('mint from minter', traits1); }); @@ -116,7 +125,7 @@ describe('mint functions', function () { const [balance0] = await token.functions.balanceOf(user3.address); - const txParams = { value: ethers.utils.parseUnits("0.009", "ether") }; + const txParams = { value: ethers.utils.parseUnits("0.09", "ether") }; await minter.connect(user3).functions.mintSelectedPrefecture(16, 3, txParams); const [balance] = await token.functions.balanceOf(user3.address); @@ -182,18 +191,20 @@ describe('mint functions', function () { const [phaze] = await minter.functions.phase(); expect(phaze).to.equal(1); // PreSale - const txParams = { value: ethers.utils.parseUnits("0.009", "ether") }; + const txParams = { value: ethers.utils.parseUnits("0.09", "ether") }; + // この後でSampleTokenをmintするので、node起動後の1回目しか正常に動作しない await expect(minter.connect(user4).functions.mintSelectedPrefecture(1, 1, txParams)) .revertedWith('TokenGate token is needed'); // sampleTokenをミント await sampleToken.connect(user4).functions.mint(); + const [balance] = await token.functions.balanceOf(user4.address); await minter.connect(user4).functions.mintSelectedPrefecture(1, 3, txParams); - const [balance] = await token.functions.balanceOf(user4.address); + const [balance2] = await token.functions.balanceOf(user4.address); - expect(balance.toNumber()).to.equal(3); // user4は3つ追加 + expect(balance2.toNumber() - balance.toNumber()).to.equal(3); // user4は3つ追加 await minter.connect(owner).functions.setPhase(2); const [phaze2] = await minter.functions.phase(); @@ -208,12 +219,12 @@ describe('mint functions', function () { expect(phaze).to.equal(2); // PreSale // 都道府県指定 OKパターンは'multiple mint'テストで実施 - const txParams = { value: ethers.utils.parseUnits("0.0059", "ether") }; + const txParams = { value: ethers.utils.parseUnits("0.059", "ether") }; await expect(minter.connect(user4).functions.mintSelectedPrefecture(1, 2, txParams)) .revertedWith('Must send the mint price'); // 都道府県指定なし OKパターンは'mint from minter'テストで実施 - const txParams2 = { value: ethers.utils.parseUnits("0.0019", "ether") }; + const txParams2 = { value: ethers.utils.parseUnits("0.019", "ether") }; await expect(minter.connect(user4).functions.mintSelectedPrefecture(0, 2, txParams2)) .revertedWith('Must send the mint price'); @@ -224,10 +235,9 @@ describe('mint functions', function () { describe('determinePrefectureId', function () { it('determinePrefectureId', async function () { - await provider.connect(owner).functions.setRandomValueForTest(true); let prefectureCount = new Array(47).fill(0); - for (var i = 0; i < 300; i++) { + for (var i = 0; i < 1500; i++) { const [prefectureId] = await provider.connect(owner).functions.determinePrefectureId(i); prefectureCount[prefectureId.toNumber() - 1]++; } @@ -235,21 +245,40 @@ describe('determinePrefectureId', function () { // 全ての都道府県が1以上出現する for (var i = 0; i < prefectureCount.length; i++) { expect(prefectureCount[i]).to.greaterThan(0); - // console.log("prefectureId", i, prefectureCount[i]); + console.log("prefectureId", i+1, prefectureCount[i], prefectureCount[i]/1500*100 + '%'); } - await provider.connect(owner).functions.setRandomValueForTest(false); }); + + it('mint all prefecture', async function () { + + await minter.connect(owner).functions.setPhase(2); + const txParams = { value: ethers.utils.parseUnits("0.3", "ether") }; + + // 全ての都道府県が1以上出現する + for (var i = 0; i < 47; i++) { + // ミント前の都道府県ごとのカウント + const [mintNumberPerPrefecture] = await provider.functions.mintNumberPerPrefecture(i + 1); + + // console.log("mint all prefecture", i + 1); + await minter.connect(user1).functions.mintSelectedPrefecture(i + 1, 5, txParams); + + // ミント後の都道府県ごとのカウント + const [mintNumberPerPrefecture2] = await provider.functions.mintNumberPerPrefecture(i + 1); + + expect(mintNumberPerPrefecture2.sub(mintNumberPerPrefecture).toNumber(), "prefectureId:" + (i + 1)).to.equal(5); + } + + }).timeout(600000); // タイムアウトを60秒に設定 }); describe('P2P', function () { let tx, result, tokenId1: number; - const zeroAddress = '0x0000000000000000000000000000000000000000'; const price = ethers.BigNumber.from('1000000000000000'); it('not on sale', async function () { - const txParams = { value: ethers.utils.parseUnits("0.003", "ether") }; + const txParams = { value: ethers.utils.parseUnits("0.03", "ether") }; await minter.connect(user1).functions.mintSelectedPrefecture(10, 1, txParams); result = await token.totalSupply(); tokenId1 = result.toNumber() - 1; @@ -266,13 +295,13 @@ describe('P2P', function () { const [mintMax] = await minter.functions.mintMax(); expect(mintMax.toNumber()).to.equal(totalSupply.toNumber() + 1); - const txParams = { value: ethers.utils.parseUnits("0.006", "ether") }; + const txParams = { value: ethers.utils.parseUnits("0.06", "ether") }; await expect(minter.connect(user5).functions.mintSelectedPrefecture(47, 2, txParams)) .revertedWith('Over the mint limit'); // 一つだけならOK const [balance] = await token.functions.balanceOf(user5.address); - const txParams2 = { value: ethers.utils.parseUnits("0.003", "ether") }; + const txParams2 = { value: ethers.utils.parseUnits("0.03", "ether") }; await minter.connect(user5).functions.mintSelectedPrefecture(47, 1, txParams2); const [balancea] = await token.functions.balanceOf(user5.address); @@ -296,17 +325,26 @@ describe('P2P', function () { it('Purchase', async function () { await expect(token.connect(user2).purchase(tokenId1, user2.address, zeroAddress)).revertedWith('Not enough fund'); + // await token.connect(owner).setAdministratorsAddress(admin.address); + // await token.connect(owner).setDeveloppersAddress(developper.address); + await token.connect(owner).setRoyaltyAddresses([developper.address,admin.address],[3,1]); + + result = await token.ownerOf(tokenId1); + const balance1 = await ethers.provider.getBalance(user1.address); - const balanceT = await ethers.provider.getBalance(owner.address); + const balanceA = await ethers.provider.getBalance(admin.address); + const balanceD = await ethers.provider.getBalance(developper.address); await token.connect(user2).purchase(tokenId1, user2.address, zeroAddress, { value: price }); result = await token.ownerOf(tokenId1); expect(result).equal(user2.address); const balance12 = await ethers.provider.getBalance(user1.address); - expect(balance12.sub(balance1)).equal(price.div(20).mul(19)); // 95% - const balanceT2 = await ethers.provider.getBalance(owner.address); - expect(balanceT2.sub(balanceT)).equal(price.div(20).mul(1)); // 5% + expect(balance12.sub(balance1)).equal(price.div(40).mul(36)); // 90% + const balanceA2 = await ethers.provider.getBalance(admin.address); + expect(balanceA2.sub(balanceA)).equal(price.div(40).mul(1)); // 5% + const balanceD2 = await ethers.provider.getBalance(developper.address); + expect(balanceD2.sub(balanceD)).equal(price.div(40).mul(3)); // 15% }); @@ -318,10 +356,11 @@ describe('P2P', function () { describe('P2PTradable', function () { let result, tx, err, balance, tokenId1: number, tokenId2: number; + const txParams = { value: ethers.utils.parseUnits("0.003", "ether") }; it('mint for test', async function () { // for user1 - const txParams = { value: ethers.utils.parseUnits("0.003", "ether") }; + const txParams = { value: ethers.utils.parseUnits("0.03", "ether") }; await minter.connect(user1).functions.mintSelectedPrefecture(5, 1, txParams); result = await token.totalSupply(); tokenId1 = result.toNumber() - 1; @@ -334,33 +373,36 @@ describe('P2PTradable', function () { }); it('Attempt to super functions', async function () { - await expect(token.connect(user2).executeTrade(tokenId2, tokenId1)).revertedWith('Cannot use this function'); + await expect(token.connect(user2).executeTrade(tokenId2, tokenId1)).revertedWith('Cannot use'); - await expect(token.connect(user2).putTrade(tokenId1, true)).revertedWith('Cannot use this function'); + await expect(token.connect(user2).putTrade(tokenId1, true)).revertedWith('Cannot use'); }); it('Attempt to trade non-tradable token', async function () { - await expect(token.connect(user2).executeTradeLocalNoun(tokenId2, tokenId1)).revertedWith('TargetTokenId is not on trade'); + await expect(token.connect(user2).executeTradeLocalNoun(tokenId2, tokenId1, txParams)).revertedWith('TargetTokenId is not on trade'); }); it('Attempt to execute trade non-owner token', async function () { - await expect(token.connect(user2).executeTradeLocalNoun(tokenId1, tokenId2)).revertedWith('Only the onwer can trade'); + await expect(token.connect(user2).executeTradeLocalNoun(tokenId1, tokenId2, txParams)).revertedWith('Only the onwer can trade'); }); it('Attempt to put trade non-owner token', async function () { - await expect(token.connect(user2).putTradeLocalNoun(tokenId1, [])).revertedWith('Only the onwer can trade'); + await expect(token.connect(user2).putTradeLocalNoun(tokenId1, [], zeroAddress)).revertedWith('Only the onwer can trade'); }); it('incorrect prefecutre id', async function () { - await expect(token.connect(user2).putTradeLocalNoun(tokenId1, [0])).revertedWith('incorrect prefecutre id'); - await expect(token.connect(user2).putTradeLocalNoun(tokenId1, [48])).revertedWith('incorrect prefecutre id'); + await expect(token.connect(user2).putTradeLocalNoun(tokenId1, [0], zeroAddress)).revertedWith('incorrect prefecutre id'); + await expect(token.connect(user2).putTradeLocalNoun(tokenId1, [48], zeroAddress)).revertedWith('incorrect prefecutre id'); }); it('put trade', async function () { + + await token.connect(owner).setRoyaltyAddresses([developper.address,admin.address],[1,1]); + // 希望都道府県外のトークンと交換しようとする - await token.connect(user1).putTradeLocalNoun(tokenId1, [1, 11, 12]); - await expect(token.connect(user2).executeTradeLocalNoun(tokenId2, tokenId1)).revertedWith('unmatch to the wants list'); + await token.connect(user1).putTradeLocalNoun(tokenId1, [1, 11, 12], zeroAddress); + await expect(token.connect(user2).executeTradeLocalNoun(tokenId2, tokenId1, txParams)).revertedWith('unmatch to the wants list'); result = await token.connect(user1).getTradePrefectureFor(tokenId1); expect(result.length).equal(3); @@ -368,11 +410,18 @@ describe('P2PTradable', function () { expect(result[1].toNumber()).equal(11); expect(result[2].toNumber()).equal(12); - await token.connect(user1).putTradeLocalNoun(tokenId1, [10, 11, 12]); + await token.connect(user1).putTradeLocalNoun(tokenId1, [10, 11, 12], zeroAddress); result = await token.connect(user1).trades(tokenId1); expect(result).equal(true); - tx = await token.connect(user2).executeTradeLocalNoun(tokenId2, tokenId1); + // 実行前の保持ETH + const balanceA = await ethers.provider.getBalance(admin.address); + const balanceD = await ethers.provider.getBalance(developper.address); + + const txParams2 = { value: ethers.utils.parseUnits("0.0029", "ether") }; + await expect(token.connect(user2).executeTradeLocalNoun(tokenId2, tokenId1, txParams2)).revertedWith('Insufficial royalty'); + + tx = await token.connect(user2).executeTradeLocalNoun(tokenId2, tokenId1, txParams); await tx.wait(); result = await token.connect(user1).trades(tokenId1); expect(result).equal(false); //トレードリストから解除 @@ -382,11 +431,18 @@ describe('P2PTradable', function () { result = await token.connect(user1).ownerOf(tokenId2); expect(result).equal(user1.address); + + // 実行後の保持ETH + const balanceA2 = await ethers.provider.getBalance(admin.address); + const balanceD2 = await ethers.provider.getBalance(developper.address); + expect(balanceA2.sub(balanceA)).to.equal(ethers.utils.parseUnits("0.0015", "ether")); + expect(balanceD2.sub(balanceD)).to.equal(ethers.utils.parseUnits("0.0015", "ether")); + }); it('put trade(都道府県指定なし)', async function () { // for user1 - const txParams = { value: ethers.utils.parseUnits("0.003", "ether") }; + const txParams = { value: ethers.utils.parseUnits("0.03", "ether") }; await minter.connect(user1).functions.mintSelectedPrefecture(10, 1, txParams); result = await token.totalSupply(); tokenId1 = result.toNumber() - 1; @@ -397,7 +453,7 @@ describe('P2PTradable', function () { tokenId2 = result.toNumber() - 1; // 希望都道府県なしでトレードリストに出す - await token.connect(user1).putTradeLocalNoun(tokenId1, []); + await token.connect(user1).putTradeLocalNoun(tokenId1, [], zeroAddress); result = await token.connect(user1).trades(tokenId1); expect(result).equal(true); @@ -405,7 +461,44 @@ describe('P2PTradable', function () { result = await token.connect(user1).getTradePrefectureFor(tokenId1); expect(result.length).equal(0); - tx = await token.connect(user2).executeTradeLocalNoun(tokenId2, tokenId1); + tx = await token.connect(user2).executeTradeLocalNoun(tokenId2, tokenId1, txParams); + await tx.wait(); + result = await token.connect(user1).trades(tokenId1); + expect(result).equal(false); //トレードリストから解除 + + result = await token.connect(user1).ownerOf(tokenId1); + expect(result).equal(user2.address); + + result = await token.connect(user1).ownerOf(tokenId2); + expect(result).equal(user1.address); + }); + + it('put trade(トレード先アドレス指定)', async function () { + // for user1 + const txParams = { value: ethers.utils.parseUnits("0.03", "ether") }; + await minter.connect(user1).functions.mintSelectedPrefecture(10, 1, txParams); + result = await token.totalSupply(); + tokenId1 = result.toNumber() - 1; + + // for user2 + await minter.connect(user2).functions.mintSelectedPrefecture(10, 1, txParams); + result = await token.totalSupply(); + tokenId2 = result.toNumber() - 1; + + // ユーザ2のアドレス指定でトレードリストに出す + await token.connect(user1).putTradeLocalNoun(tokenId1, [], user2.address); + + result = await token.connect(user1).trades(tokenId1); + expect(result).equal(true); + + result = await token.connect(user1).tradeAddress(tokenId1); + expect(result).equal(user2.address); + + // ユーザ3がトレードしようとする → 失敗 + await expect(token.connect(user3).executeTradeLocalNoun(tokenId2, tokenId1, txParams)).revertedWith('Limited address can trade'); + + // ユーザ2がトレードしようとする → 成功 + tx = await token.connect(user2).executeTradeLocalNoun(tokenId2, tokenId1, txParams); await tx.wait(); result = await token.connect(user1).trades(tokenId1); expect(result).equal(false); //トレードリストから解除 @@ -419,7 +512,7 @@ describe('P2PTradable', function () { it('cancel trade', async function () { // for user1 - const txParams = { value: ethers.utils.parseUnits("0.003", "ether") }; + const txParams = { value: ethers.utils.parseUnits("0.03", "ether") }; await minter.connect(user1).functions.mintSelectedPrefecture(10, 1, txParams); result = await token.totalSupply(); tokenId1 = result.toNumber() - 1; @@ -430,7 +523,7 @@ describe('P2PTradable', function () { tokenId2 = result.toNumber() - 1; // 希望都道府県なしでトレードリストに出す - await token.connect(user1).putTradeLocalNoun(tokenId1, []); + await token.connect(user1).putTradeLocalNoun(tokenId1, [], zeroAddress); result = await token.connect(user1).trades(tokenId1); expect(result).equal(true); @@ -443,8 +536,102 @@ describe('P2PTradable', function () { result = await token.connect(user1).trades(tokenId1); expect(result).equal(false); //トレードリストから解除 - await expect(token.connect(user2).executeTradeLocalNoun(tokenId2, tokenId1)).revertedWith('TargetTokenId is not on trade'); + await expect(token.connect(user2).executeTradeLocalNoun(tokenId2, tokenId1, txParams)).revertedWith('TargetTokenId is not on trade'); }); -}); \ No newline at end of file +}); + + +describe('Approval', function () { + let result, tx, err, balance, tokenId1: number, tokenId2: number; + const txParams = { value: ethers.utils.parseUnits("0.003", "ether") }; + + it('Approvale error', async function () { + await minter.connect(owner).functions.setPhase(2); + // for user1 + const txParams = { value: ethers.utils.parseUnits("0.03", "ether") }; + await minter.connect(user1).functions.mintSelectedPrefecture(5, 1, txParams); + result = await token.totalSupply(); + tokenId1 = result.toNumber() - 1; + + await expect(token.connect(user1).functions.setApprovalForAll(user2.address, true)).revertedWith('Not allowed to set approval for all'); + + await expect(token.connect(user1).functions.approve(user2.address, tokenId1)).revertedWith('Not allowed to approve'); + }); + + it('setApprovalForAll', async function () { + await minter.connect(owner).functions.setPhase(2); + // for user1 + const txParams = { value: ethers.utils.parseUnits("0.03", "ether") }; + await minter.connect(user1).functions.mintSelectedPrefecture(5, 1, txParams); + result = await token.totalSupply(); + tokenId1 = result.toNumber() - 1; + + await token.connect(owner).functions.setCanSetAproval(true); + + await token.connect(user1).functions.setApprovalForAll(user2.address, true); + + result = await token.isApprovedForAll(user1.address, user2.address); + + expect(result).equal(true); + + + }); + + it('setApprovalForAllWithWhiteList', async function () { + await minter.connect(owner).functions.setPhase(2); + // for user1 + const txParams = { value: ethers.utils.parseUnits("0.03", "ether") }; + await minter.connect(user1).functions.mintSelectedPrefecture(5, 1, txParams); + result = await token.totalSupply(); + tokenId1 = result.toNumber() - 1; + + await token.connect(owner).functions.setCanSetAproval(false); + await token.connect(owner).functions.setApproveWhiteList(user2.address, true); + + await token.connect(user1).functions.setApprovalForAll(user2.address, true); + + result = await token.isApprovedForAll(user1.address, user2.address); + + expect(result).equal(true); + }); + + it('approve', async function () { + await minter.connect(owner).functions.setPhase(2); + // for user1 + const txParams = { value: ethers.utils.parseUnits("0.03", "ether") }; + await minter.connect(user1).functions.mintSelectedPrefecture(5, 1, txParams); + result = await token.totalSupply(); + tokenId1 = result.toNumber() - 1; + + await token.connect(owner).functions.setCanSetAproval(true); + + await token.connect(user1).functions.approve(user2.address, tokenId1); + + result = await token.getApproved(tokenId1); + + expect(result).equal(user2.address); + + + }); + + it('approveWithWhiteList', async function () { + await minter.connect(owner).functions.setPhase(2); + // for user1 + const txParams = { value: ethers.utils.parseUnits("0.03", "ether") }; + await minter.connect(user1).functions.mintSelectedPrefecture(5, 1, txParams); + result = await token.totalSupply(); + tokenId1 = result.toNumber() - 1; + + await token.connect(owner).functions.setCanSetAproval(false); + await token.connect(owner).functions.setApproveWhiteList(user2.address, true); + + await token.connect(user1).functions.approve(user2.address, tokenId1); + + result = await token.getApproved(tokenId1); + + expect(result).equal(user2.address); + }); + +}); diff --git a/contract/test/localNounsMinter2.ts b/contract/test/localNounsMinter2.ts new file mode 100644 index 00000000..c03343ab --- /dev/null +++ b/contract/test/localNounsMinter2.ts @@ -0,0 +1,660 @@ +import { expect } from 'chai'; +import { ethers, network, SignerWithAddress, Contract } from "hardhat"; +import { addresses } from '../../src/utils/addresses'; +import { ethers } from 'ethers'; +import { abi as sampleTokenAbi } from "../artifacts/contracts/sampleToken.sol/sampleToken"; + +let owner: SignerWithAddress, user1: SignerWithAddress, user2: SignerWithAddress, user3: SignerWithAddress, user4: SignerWithAddress, user5: SignerWithAddress, admin: SignerWithAddress, developper: SignerWithAddress; +let token: Contract, minter: Contract, provider: Contract, tokenGate: Contract, sampleToken: Contract; + +const nounsDescriptorAddress = addresses.nounsDescriptor[network.name]; +const localNounsDescriptorAddress = addresses.localNounsDescriptor[network.name]; +const nounsSeederAddress = addresses.nounsSeeder[network.name]; +const localSeederAddress = addresses.localSeeder[network.name]; +const sampleTokenAddress = addresses.sampleToken[network.name]; + +const zeroAddress = '0x0000000000000000000000000000000000000000'; + +before(async () => { + /* `npx hardhat node`実行後、このスクリプトを実行する前に、Nouns,LocalNounsの関連するコントラクトを + * デプロイする必要があります。(一度実行すると、node停止までは再実施する必要なし) + # cd contract + npx hardhat run scripts/deploy_nounsDescriptorV1.ts + npx hardhat run scripts/populate_nounsV1.ts + npx hardhat run scripts/deploy_localNouns.ts + npx hardhat run scripts/populate_localNouns.ts + npx hardhat run scripts/deploy_sample.ts + + note: `npx hardhat node`実行時にJavaScript heap out of memory が発生した場合は環境変数で使用メモリを指定する + export NODE_OPTIONS=--max-old-space-size=4096 + + # テスト実行 + # npx hardhat test test/localNounsMinter2.ts + + */ + + [owner, user1, user2, user3, user4, user5, admin, developper] = await ethers.getSigners(); + + const factoryTokenGate = await ethers.getContractFactory('AssetTokenGate'); + tokenGate = await factoryTokenGate.deploy(); + await tokenGate.deployed(); + + const factoryProvider = await ethers.getContractFactory('LocalNounsProvider2'); + provider = await factoryProvider.deploy( + nounsDescriptorAddress, localNounsDescriptorAddress); + await provider.deployed(); + // console.log(`##LocalNounsProvider="${provider.address}"`); + + const factoryToken = await ethers.getContractFactory('LocalNounsToken'); + token = await factoryToken.deploy(provider.address, owner.address); + await token.deployed(); + // console.log(`##LocalNounsToken="${token.address}"`); + + const factoryMinter = await ethers.getContractFactory('LocalNounsMinter2'); + minter = await factoryMinter.deploy(token.address, tokenGate.address); + await minter.deployed(); + // console.log(`##LocalNounsMinter="${minter.address}"`); + + await token.setMinter(minter.address); + + // sampleTokenのコントラクト定義 + sampleToken = await ethers.getContractAt(sampleTokenAbi, sampleTokenAddress); + + // tokenGateにsampleTokenをセット + await tokenGate.setWhitelist([sampleToken.address]); + +}); + +describe('mint functions', function () { + let result, tx; + + it('mint from non-minter', async function () { + await expect(token.connect(user1).functions.mint()) + .revertedWith('Cannot use'); + + await expect(token.connect(user1).functions.mintSelectedPrefecture(user1.address, 1, 1)) + .revertedWith('Invalid sender'); + + await expect(token.connect(user1).functions.ownerMint([user1.address], [1], [1])) + .revertedWith('Ownable: caller is not the owner'); + + }); + + it('mint at lock phaze', async function () { + + const [phaze] = await minter.functions.phase(); + expect(phaze).to.equal(2); // PublicSale + + await minter.connect(owner).functions.setPhase(0); + const [phaze2] = await minter.functions.phase(); + expect(phaze2).to.equal(0); // PublicSale + + await expect(minter.connect(user1).functions.mintSelectedPrefecture(1, 1)) + .revertedWith('Sale is locked'); + + await minter.connect(owner).functions.setPhase(2); + const [phaze3] = await minter.functions.phase(); + expect(phaze3).to.equal(2); // PublicSale + + }); + + it('Invalid prefectureId', async function () { + + // OKパターンは別テストで実施 + const txParams = { value: ethers.utils.parseUnits("0.03", "ether") }; + await expect(minter.connect(user4).functions.mintSelectedPrefecture(48, 1, txParams)) + .revertedWith('Invalid prefectureId'); + }); + + it('mint from minter', async function () { + + const txParams = { value: ethers.utils.parseUnits("0.01", "ether") }; + await minter.connect(user1).functions.mintSelectedPrefecture(0, 1, txParams); + + const [balance] = await token.functions.balanceOf(user1.address); + expect(balance.toNumber()).to.equal(1); // user1は1つ保持 + + const [owner0] = await token.functions.ownerOf(0); + expect(owner0).to.equal(user1.address); + + const [totalSupply] = await token.functions.totalSupply(); + expect(totalSupply.toNumber()).to.equal(1); // tokenId=1 + + const [traits1] = await provider.functions.generateTraits(0); + // console.log('mint from minter', traits1); + + }); + + it('mint from minter2', async function () { + + const txParams = { value: ethers.utils.parseUnits("0.01", "ether") }; + await minter.connect(user1).functions.mintSelectedPrefecture2(0, 1, user2.address, txParams); + + const [balance] = await token.functions.balanceOf(user2.address); + expect(balance.toNumber()).to.equal(1); // user2は1つ保持 + + const [owner1] = await token.functions.ownerOf(1); + expect(owner1).to.equal(user2.address); + + const [totalSupply] = await token.functions.totalSupply(); + expect(totalSupply.toNumber()).to.equal(2); // tokenId=1 + + const [traits1] = await provider.functions.generateTraits(1); + // console.log('mint from minter', traits1); + + }); + + it('multiple mint', async function () { + + const [balance0] = await token.functions.balanceOf(user3.address); + + const txParams = { value: ethers.utils.parseUnits("0.09", "ether") }; + await minter.connect(user3).functions.mintSelectedPrefecture(16, 3, txParams); + + const [balance] = await token.functions.balanceOf(user3.address); + + expect(balance.toNumber()).to.equal(3); // user3は3つ追加 + + const [owner0] = await token.functions.ownerOf(2); + expect(owner0).to.equal(user3.address); + + const [owner1] = await token.functions.ownerOf(3); + expect(owner1).to.equal(user3.address); + + const [owner2] = await token.functions.ownerOf(4); + expect(owner2).to.equal(user3.address); + + const [totalSupply] = await token.functions.totalSupply(); + expect(totalSupply.toNumber()).to.equal(5); // tokenId=1 + + // Traitsに指定した都道府県名が設定される + const [traits1] = await provider.functions.generateTraits(2); + const [traits2] = await provider.functions.generateTraits(3); + const [traits3] = await provider.functions.generateTraits(4); + // head,accessoryがランダムなので県のみチェック(head,accessoryは目視) + console.log('multiple mint', traits1); + console.log('multiple mint', traits2); + console.log('multiple mint', traits3); + expect(traits1.includes('{"trait_type": "prefecture" , "value":"Toyama"}')).to.equal(true); + expect(traits2.includes('{"trait_type": "prefecture" , "value":"Toyama"}')).to.equal(true); + expect(traits3.includes('{"trait_type": "prefecture" , "value":"Toyama"}')).to.equal(true); + + // 都道府県ごとのミント数 + const [mintNumberPerPrefecture] = await provider.functions.mintNumberPerPrefecture(16); + expect(mintNumberPerPrefecture.toNumber()).to.equal(3); // tokenId=1 + + }); + + it('owner mint', async function () { + + const [balance3] = await token.functions.balanceOf(user3.address); + const [balance4] = await token.functions.balanceOf(user4.address); + const [balance5] = await token.functions.balanceOf(user5.address); + const [totalSupply] = await token.functions.totalSupply(); + + const txParams = { value: 0 }; + await token.connect(owner).functions.ownerMint([user3.address, user4.address, user5.address], [3, 5, 0], [1, 2, 20], txParams); + + const [balance3a] = await token.functions.balanceOf(user3.address); + const [balance4a] = await token.functions.balanceOf(user4.address); + const [balance5a] = await token.functions.balanceOf(user5.address); + + expect(balance3a.toNumber()).to.equal(balance3.toNumber() + 1); + expect(balance4a.toNumber()).to.equal(balance4.toNumber() + 2); + expect(balance5a.toNumber()).to.equal(balance5.toNumber() + 20); + + const [totalSupplya] = await token.functions.totalSupply(); + expect(totalSupplya.toNumber()).to.equal(totalSupply.toNumber() + 23); + + }); + + it('tokenGate', async function () { + + await minter.connect(owner).functions.setPhase(1); + const [phaze] = await minter.functions.phase(); + expect(phaze).to.equal(1); // PreSale + + const txParams = { value: ethers.utils.parseUnits("0.09", "ether") }; + // この後でSampleTokenをmintするので、node起動後の1回目しか正常に動作しない + await expect(minter.connect(user4).functions.mintSelectedPrefecture(1, 1, txParams)) + .revertedWith('TokenGate token is needed'); + + // sampleTokenをミント + await sampleToken.connect(user4).functions.mint(); + + const [balance] = await token.functions.balanceOf(user4.address); + await minter.connect(user4).functions.mintSelectedPrefecture(1, 3, txParams); + + const [balance2] = await token.functions.balanceOf(user4.address); + + expect(balance2.toNumber() - balance.toNumber()).to.equal(3); // user4は3つ追加 + + await minter.connect(owner).functions.setPhase(2); + const [phaze2] = await minter.functions.phase(); + expect(phaze2).to.equal(2); // PublicSale + + }); + + it('Send eth', async function () { + + await minter.connect(owner).functions.setPhase(2); + const [phaze] = await minter.functions.phase(); + expect(phaze).to.equal(2); // PreSale + + // 都道府県指定 OKパターンは'multiple mint'テストで実施 + const txParams = { value: ethers.utils.parseUnits("0.059", "ether") }; + await expect(minter.connect(user4).functions.mintSelectedPrefecture(1, 2, txParams)) + .revertedWith('Must send the mint price'); + + // 都道府県指定なし OKパターンは'mint from minter'テストで実施 + const txParams2 = { value: ethers.utils.parseUnits("0.019", "ether") }; + await expect(minter.connect(user4).functions.mintSelectedPrefecture(0, 2, txParams2)) + .revertedWith('Must send the mint price'); + + }); + +}); + +describe('determinePrefectureId', function () { + it.skip('determinePrefectureId', async function () { + + let prefectureCount = new Array(47).fill(0); + + for (var i = 0; i < 1500; i++) { + const [prefectureId] = await provider.connect(owner).functions.determinePrefectureId(i); + prefectureCount[prefectureId.toNumber() - 1]++; + } + + // 全ての都道府県が1以上出現する + for (var i = 0; i < prefectureCount.length; i++) { + expect(prefectureCount[i]).to.greaterThan(0); + console.log("prefectureId", i+1, prefectureCount[i], prefectureCount[i]/1500*100 + '%'); + } + + }); + + it('mint all prefecture', async function () { + + await minter.connect(owner).functions.setPhase(2); + const txParams = { value: ethers.utils.parseUnits("0.3", "ether") }; + + // 全ての都道府県が1以上出現する + for (var i = 0; i < 47; i++) { + // ミント前の都道府県ごとのカウント + const [mintNumberPerPrefecture] = await provider.functions.mintNumberPerPrefecture(i + 1); + + // console.log("mint all prefecture", i + 1); + await minter.connect(user1).functions.mintSelectedPrefecture(i + 1, 5, txParams); + + // ミント後の都道府県ごとのカウント + const [mintNumberPerPrefecture2] = await provider.functions.mintNumberPerPrefecture(i + 1); + + expect(mintNumberPerPrefecture2.sub(mintNumberPerPrefecture).toNumber(), "prefectureId:" + (i + 1)).to.equal(5); + } + + }).timeout(600000); // タイムアウトを60秒に設定 +}); + +describe('P2P', function () { + let tx, result, tokenId1: number; + const price = ethers.BigNumber.from('1000000000000000'); + + it('not on sale', async function () { + + const txParams = { value: ethers.utils.parseUnits("0.03", "ether") }; + await minter.connect(user1).functions.mintSelectedPrefecture(10, 1, txParams); + result = await token.totalSupply(); + tokenId1 = result.toNumber() - 1; + + // セールなし + await expect(token.connect(user2).purchase(tokenId1, user2.address, zeroAddress)).revertedWith('Token is not on sale'); + }); + + it('Over the mint limit', async function () { + + // mintMaxに現在の発行数+1をセット + const [totalSupply] = await token.functions.totalSupply(); + await minter.functions.setMintMax(totalSupply.toNumber() + 1); + const [mintMax] = await minter.functions.mintMax(); + expect(mintMax.toNumber()).to.equal(totalSupply.toNumber() + 1); + + const txParams = { value: ethers.utils.parseUnits("0.06", "ether") }; + await expect(minter.connect(user5).functions.mintSelectedPrefecture(47, 2, txParams)) + .revertedWith('Over the mint limit'); + + // 一つだけならOK + const [balance] = await token.functions.balanceOf(user5.address); + const txParams2 = { value: ethers.utils.parseUnits("0.03", "ether") }; + await minter.connect(user5).functions.mintSelectedPrefecture(47, 1, txParams2); + + const [balancea] = await token.functions.balanceOf(user5.address); + expect(balancea.toNumber()).to.equal(balance.toNumber() + 1); // user1は1つ保持 + + await minter.functions.setMintMax(1500); + const [mintMax2] = await minter.functions.mintMax(); + expect(mintMax2.toNumber()).to.equal(1500); + }); + + it('SetPrice', async function () { + await expect(token.connect(user2).setPriceOf(tokenId1, price)).revertedWith('Only the onwer can set the price'); + await token.connect(user1).setPriceOf(tokenId1, price); + result = await token.getPriceOf(tokenId1); + expect(result.toNumber()).equal(price); + + await expect(token.connect(user2).purchase(tokenId1, user2.address, zeroAddress)).revertedWith('Not enough fund'); + + }); + + it('Purchase', async function () { + await expect(token.connect(user2).purchase(tokenId1, user2.address, zeroAddress)).revertedWith('Not enough fund'); + + // await token.connect(owner).setAdministratorsAddress(admin.address); + // await token.connect(owner).setDeveloppersAddress(developper.address); + await token.connect(owner).setRoyaltyAddresses([developper.address,admin.address],[3,1]); + + result = await token.ownerOf(tokenId1); + + const balance1 = await ethers.provider.getBalance(user1.address); + const balanceA = await ethers.provider.getBalance(admin.address); + const balanceD = await ethers.provider.getBalance(developper.address); + + await token.connect(user2).purchase(tokenId1, user2.address, zeroAddress, { value: price }); + result = await token.ownerOf(tokenId1); + expect(result).equal(user2.address); + + const balance12 = await ethers.provider.getBalance(user1.address); + expect(balance12.sub(balance1)).equal(price.div(40).mul(36)); // 90% + const balanceA2 = await ethers.provider.getBalance(admin.address); + expect(balanceA2.sub(balanceA)).equal(price.div(40).mul(1)); // 5% + const balanceD2 = await ethers.provider.getBalance(developper.address); + expect(balanceD2.sub(balanceD)).equal(price.div(40).mul(3)); // 15% + + }); + + it('Attempt to setprice/buy by user1', async function () { + await expect(token.connect(user1).purchase(0, user2.address, zeroAddress, { value: price })).revertedWith('Token is not on sale'); + await expect(token.connect(user1).setPriceOf(tokenId1, price)).revertedWith('Only the onwer can set the price'); + }); +}); + +describe('P2PTradable', function () { + let result, tx, err, balance, tokenId1: number, tokenId2: number; + const txParams = { value: ethers.utils.parseUnits("0.003", "ether") }; + + it('mint for test', async function () { + // for user1 + const txParams = { value: ethers.utils.parseUnits("0.03", "ether") }; + await minter.connect(user1).functions.mintSelectedPrefecture(5, 1, txParams); + result = await token.totalSupply(); + tokenId1 = result.toNumber() - 1; + + // for user2 + await minter.connect(user2).functions.mintSelectedPrefecture(10, 1, txParams); + result = await token.totalSupply(); + tokenId2 = result.toNumber() - 1; + + }); + + it('Attempt to super functions', async function () { + await expect(token.connect(user2).executeTrade(tokenId2, tokenId1)).revertedWith('Cannot use'); + + await expect(token.connect(user2).putTrade(tokenId1, true)).revertedWith('Cannot use'); + + }); + + it('Attempt to trade non-tradable token', async function () { + await expect(token.connect(user2).executeTradeLocalNoun(tokenId2, tokenId1, txParams)).revertedWith('TargetTokenId is not on trade'); + }); + + it('Attempt to execute trade non-owner token', async function () { + await expect(token.connect(user2).executeTradeLocalNoun(tokenId1, tokenId2, txParams)).revertedWith('Only the onwer can trade'); + }); + + it('Attempt to put trade non-owner token', async function () { + await expect(token.connect(user2).putTradeLocalNoun(tokenId1, [], zeroAddress)).revertedWith('Only the onwer can trade'); + }); + + it('incorrect prefecutre id', async function () { + await expect(token.connect(user2).putTradeLocalNoun(tokenId1, [0], zeroAddress)).revertedWith('incorrect prefecutre id'); + await expect(token.connect(user2).putTradeLocalNoun(tokenId1, [48], zeroAddress)).revertedWith('incorrect prefecutre id'); + }); + + it('put trade', async function () { + + await token.connect(owner).setRoyaltyAddresses([developper.address,admin.address],[1,1]); + + // 希望都道府県外のトークンと交換しようとする + await token.connect(user1).putTradeLocalNoun(tokenId1, [1, 11, 12], zeroAddress); + await expect(token.connect(user2).executeTradeLocalNoun(tokenId2, tokenId1, txParams)).revertedWith('unmatch to the wants list'); + + result = await token.connect(user1).getTradePrefectureFor(tokenId1); + expect(result.length).equal(3); + expect(result[0].toNumber()).equal(1); + expect(result[1].toNumber()).equal(11); + expect(result[2].toNumber()).equal(12); + + await token.connect(user1).putTradeLocalNoun(tokenId1, [10, 11, 12], zeroAddress); + result = await token.connect(user1).trades(tokenId1); + expect(result).equal(true); + + // 実行前の保持ETH + const balanceA = await ethers.provider.getBalance(admin.address); + const balanceD = await ethers.provider.getBalance(developper.address); + + const txParams2 = { value: ethers.utils.parseUnits("0.0029", "ether") }; + await expect(token.connect(user2).executeTradeLocalNoun(tokenId2, tokenId1, txParams2)).revertedWith('Insufficial royalty'); + + tx = await token.connect(user2).executeTradeLocalNoun(tokenId2, tokenId1, txParams); + await tx.wait(); + result = await token.connect(user1).trades(tokenId1); + expect(result).equal(false); //トレードリストから解除 + + result = await token.connect(user1).ownerOf(tokenId1); + expect(result).equal(user2.address); + + result = await token.connect(user1).ownerOf(tokenId2); + expect(result).equal(user1.address); + + // 実行後の保持ETH + const balanceA2 = await ethers.provider.getBalance(admin.address); + const balanceD2 = await ethers.provider.getBalance(developper.address); + expect(balanceA2.sub(balanceA)).to.equal(ethers.utils.parseUnits("0.0015", "ether")); + expect(balanceD2.sub(balanceD)).to.equal(ethers.utils.parseUnits("0.0015", "ether")); + + }); + + it('put trade(都道府県指定なし)', async function () { + // for user1 + const txParams = { value: ethers.utils.parseUnits("0.03", "ether") }; + await minter.connect(user1).functions.mintSelectedPrefecture(10, 1, txParams); + result = await token.totalSupply(); + tokenId1 = result.toNumber() - 1; + + // for user2 + await minter.connect(user2).functions.mintSelectedPrefecture(10, 1, txParams); + result = await token.totalSupply(); + tokenId2 = result.toNumber() - 1; + + // 希望都道府県なしでトレードリストに出す + await token.connect(user1).putTradeLocalNoun(tokenId1, [], zeroAddress); + + result = await token.connect(user1).trades(tokenId1); + expect(result).equal(true); + + result = await token.connect(user1).getTradePrefectureFor(tokenId1); + expect(result.length).equal(0); + + tx = await token.connect(user2).executeTradeLocalNoun(tokenId2, tokenId1, txParams); + await tx.wait(); + result = await token.connect(user1).trades(tokenId1); + expect(result).equal(false); //トレードリストから解除 + + result = await token.connect(user1).ownerOf(tokenId1); + expect(result).equal(user2.address); + + result = await token.connect(user1).ownerOf(tokenId2); + expect(result).equal(user1.address); + }); + + it('put trade(トレード先アドレス指定)', async function () { + // for user1 + const txParams = { value: ethers.utils.parseUnits("0.03", "ether") }; + await minter.connect(user1).functions.mintSelectedPrefecture(10, 1, txParams); + result = await token.totalSupply(); + tokenId1 = result.toNumber() - 1; + + // for user2 + await minter.connect(user2).functions.mintSelectedPrefecture(10, 1, txParams); + result = await token.totalSupply(); + tokenId2 = result.toNumber() - 1; + + // ユーザ2のアドレス指定でトレードリストに出す + await token.connect(user1).putTradeLocalNoun(tokenId1, [], user2.address); + + result = await token.connect(user1).trades(tokenId1); + expect(result).equal(true); + + result = await token.connect(user1).tradeAddress(tokenId1); + expect(result).equal(user2.address); + + // ユーザ3がトレードしようとする → 失敗 + await expect(token.connect(user3).executeTradeLocalNoun(tokenId2, tokenId1, txParams)).revertedWith('Limited address can trade'); + + // ユーザ2がトレードしようとする → 成功 + tx = await token.connect(user2).executeTradeLocalNoun(tokenId2, tokenId1, txParams); + await tx.wait(); + result = await token.connect(user1).trades(tokenId1); + expect(result).equal(false); //トレードリストから解除 + + result = await token.connect(user1).ownerOf(tokenId1); + expect(result).equal(user2.address); + + result = await token.connect(user1).ownerOf(tokenId2); + expect(result).equal(user1.address); + }); + + it('cancel trade', async function () { + // for user1 + const txParams = { value: ethers.utils.parseUnits("0.03", "ether") }; + await minter.connect(user1).functions.mintSelectedPrefecture(10, 1, txParams); + result = await token.totalSupply(); + tokenId1 = result.toNumber() - 1; + + // for user2 + await minter.connect(user2).functions.mintSelectedPrefecture(10, 1, txParams); + result = await token.totalSupply(); + tokenId2 = result.toNumber() - 1; + + // 希望都道府県なしでトレードリストに出す + await token.connect(user1).putTradeLocalNoun(tokenId1, [], zeroAddress); + + result = await token.connect(user1).trades(tokenId1); + expect(result).equal(true); + + // オーなー以外がキャンセルしようとする + await expect(token.connect(user2).cancelTradeLocalNoun(tokenId1)).revertedWith('Only the onwer can trade'); + + // オーなーがキャンセルする + await token.connect(user1).cancelTradeLocalNoun(tokenId1); + result = await token.connect(user1).trades(tokenId1); + expect(result).equal(false); //トレードリストから解除 + + await expect(token.connect(user2).executeTradeLocalNoun(tokenId2, tokenId1, txParams)).revertedWith('TargetTokenId is not on trade'); + + }); + +}); + + +describe('Approval', function () { + let result, tx, err, balance, tokenId1: number, tokenId2: number; + const txParams = { value: ethers.utils.parseUnits("0.003", "ether") }; + + it('Approvale error', async function () { + await minter.connect(owner).functions.setPhase(2); + // for user1 + const txParams = { value: ethers.utils.parseUnits("0.03", "ether") }; + await minter.connect(user1).functions.mintSelectedPrefecture(5, 1, txParams); + result = await token.totalSupply(); + tokenId1 = result.toNumber() - 1; + + await expect(token.connect(user1).functions.setApprovalForAll(user2.address, true)).revertedWith('Not allowed to set approval for all'); + + await expect(token.connect(user1).functions.approve(user2.address, tokenId1)).revertedWith('Not allowed to approve'); + }); + + it('setApprovalForAll', async function () { + await minter.connect(owner).functions.setPhase(2); + // for user1 + const txParams = { value: ethers.utils.parseUnits("0.03", "ether") }; + await minter.connect(user1).functions.mintSelectedPrefecture(5, 1, txParams); + result = await token.totalSupply(); + tokenId1 = result.toNumber() - 1; + + await token.connect(owner).functions.setCanSetAproval(true); + + await token.connect(user1).functions.setApprovalForAll(user2.address, true); + + result = await token.isApprovedForAll(user1.address, user2.address); + + expect(result).equal(true); + + + }); + + it('setApprovalForAllWithWhiteList', async function () { + await minter.connect(owner).functions.setPhase(2); + // for user1 + const txParams = { value: ethers.utils.parseUnits("0.03", "ether") }; + await minter.connect(user1).functions.mintSelectedPrefecture(5, 1, txParams); + result = await token.totalSupply(); + tokenId1 = result.toNumber() - 1; + + await token.connect(owner).functions.setCanSetAproval(false); + await token.connect(owner).functions.setApproveWhiteList(user2.address, true); + + await token.connect(user1).functions.setApprovalForAll(user2.address, true); + + result = await token.isApprovedForAll(user1.address, user2.address); + + expect(result).equal(true); + }); + + it('approve', async function () { + await minter.connect(owner).functions.setPhase(2); + // for user1 + const txParams = { value: ethers.utils.parseUnits("0.03", "ether") }; + await minter.connect(user1).functions.mintSelectedPrefecture(5, 1, txParams); + result = await token.totalSupply(); + tokenId1 = result.toNumber() - 1; + + await token.connect(owner).functions.setCanSetAproval(true); + + await token.connect(user1).functions.approve(user2.address, tokenId1); + + result = await token.getApproved(tokenId1); + + expect(result).equal(user2.address); + + + }); + + it('approveWithWhiteList', async function () { + await minter.connect(owner).functions.setPhase(2); + // for user1 + const txParams = { value: ethers.utils.parseUnits("0.03", "ether") }; + await minter.connect(user1).functions.mintSelectedPrefecture(5, 1, txParams); + result = await token.totalSupply(); + tokenId1 = result.toNumber() - 1; + + await token.connect(owner).functions.setCanSetAproval(false); + await token.connect(owner).functions.setApproveWhiteList(user2.address, true); + + await token.connect(user1).functions.approve(user2.address, tokenId1); + + result = await token.getApproved(tokenId1); + + expect(result).equal(user2.address); + }); + +}); diff --git a/src/utils/addresses.ts b/src/utils/addresses.ts index 345e2521..a633c3a1 100644 --- a/src/utils/addresses.ts +++ b/src/utils/addresses.ts @@ -81,19 +81,25 @@ import { addresses as messagetoken_goerli } from "./addresses/messagetoken_goerl import { addresses as messagetoken_localhost } from "./addresses/messagetoken_localhost"; import { addresses as messagetoken_mumbai } from "./addresses/messagetoken_mumbai"; import { addresses as nounsDescriptor_mumbai } from "./addresses/nounsDescriptor_mumbai"; +import { addresses as nounsDescriptor_mainnet } from "./addresses/nounsDescriptor_mainnet"; import { addresses as nounsDescriptor_localhost } from "./addresses/nounsDescriptor_localhost"; import { addresses as nounsSeeder_mumbai } from "./addresses/nounsSeeder_mumbai"; import { addresses as nounsSeeder_localhost } from "./addresses/nounsSeeder_localhost"; +import { addresses as nftDescriptor_mainnet } from "./addresses/nftDescriptor_mainnet"; import { addresses as nftDescriptor_mumbai } from "./addresses/nftDescriptor_mumbai"; import { addresses as nftDescriptor_localhost } from "./addresses/nftDescriptor_localhost"; import { addresses as localSeeder_mumbai } from "./addresses/localseeder_mumbai"; import { addresses as localSeeder_localhost } from "./addresses/localseeder_localhost"; +import { addresses as localNounsDescriptor_mainnet } from "./addresses/localNounsDescriptor_mainnet"; import { addresses as localNounsDescriptor_mumbai } from "./addresses/localNounsDescriptor_mumbai"; import { addresses as localNounsDescriptor_localhost } from "./addresses/localNounsDescriptor_localhost"; +import { addresses as localProvider_mainnet } from "./addresses/localNounsProvider_mainnet"; import { addresses as localProvider_mumbai } from "./addresses/localNounsProvider_mumbai"; import { addresses as localProvider_localhost } from "./addresses/localNounsProvider_localhost"; +import { addresses as localNounsToken_mainnet } from "./addresses/localNounsToken_mainnet"; import { addresses as localNounsToken_mumbai } from "./addresses/localNounsToken_mumbai"; import { addresses as localNounsToken_localhost } from "./addresses/localNounsToken_localhost"; +import { addresses as localNounsMinter_mainnet } from "./addresses/localNounsMinter_mainnet"; import { addresses as localNounsMinter_mumbai } from "./addresses/localNounsMinter_mumbai"; import { addresses as localNounsMinter_localhost } from "./addresses/localNounsMinter_localhost"; @@ -315,6 +321,7 @@ export const addresses: Addresses = { goerli: dynamic_goerli.tokenGate, }, nounsDescriptor: { + mainnet: nounsDescriptor_mainnet.nounsDescriptor, mumbai: nounsDescriptor_mumbai.nounsDescriptor, localhost: nounsDescriptor_localhost.nounsDescriptor, }, @@ -323,6 +330,7 @@ export const addresses: Addresses = { localhost: nounsSeeder_localhost.nounsSeeder, }, nftDescriptor: { + mainnet: nftDescriptor_mainnet.nftDescriptor, mumbai: nftDescriptor_mumbai.nftDescriptor, localhost: nftDescriptor_localhost.nftDescriptor, }, @@ -332,18 +340,22 @@ export const addresses: Addresses = { localhost: localSeeder_localhost.localseeder, }, localNounsDescriptor: { + mainnet: localNounsDescriptor_mainnet.localNounsDescriptor, mumbai: localNounsDescriptor_mumbai.localNounsDescriptor, localhost: localNounsDescriptor_localhost.localNounsDescriptor, }, localProvider: { + mainnet: localProvider_mainnet.localNounsProvider, mumbai: localProvider_mumbai.localNounsProvider, localhost: localProvider_localhost.localNounsProvider, }, localNounsToken: { + mainnet: localNounsToken_mainnet.localNounsToken, mumbai: localNounsToken_mumbai.localNounsToken, localhost: localNounsToken_localhost.localNounsToken, }, localNounsMinter: { + mainnet: localNounsMinter_mainnet.localNounsMinter, mumbai: localNounsMinter_mumbai.localNounsMinter, localhost: localNounsMinter_localhost.localNounsMinter, }, diff --git a/src/utils/addresses/localNounsDescriptor_mainnet.ts b/src/utils/addresses/localNounsDescriptor_mainnet.ts new file mode 100644 index 00000000..8f5e7fde --- /dev/null +++ b/src/utils/addresses/localNounsDescriptor_mainnet.ts @@ -0,0 +1,3 @@ +export const addresses = { + localNounsDescriptor:"0x5524d4a7bCFF26e6545596A02cE957c498145FAc", +} diff --git a/src/utils/addresses/localNounsDescriptor_mumbai.ts b/src/utils/addresses/localNounsDescriptor_mumbai.ts index 5d3751e9..af26b8fc 100644 --- a/src/utils/addresses/localNounsDescriptor_mumbai.ts +++ b/src/utils/addresses/localNounsDescriptor_mumbai.ts @@ -1,3 +1,3 @@ export const addresses = { - localNounsDescriptor:"0x7351860b203bDDAC7e987F7d3B4e809960d05cf1", + localNounsDescriptor:"0x1b487454bBd46E6284dF2C0dFAB59a1929b976D3", } diff --git a/src/utils/addresses/localNounsMinter_mainnet.ts b/src/utils/addresses/localNounsMinter_mainnet.ts new file mode 100644 index 00000000..e829434d --- /dev/null +++ b/src/utils/addresses/localNounsMinter_mainnet.ts @@ -0,0 +1,3 @@ +export const addresses = { + localNounsMinter:"0xABeA2710271E7294dffE6a02B90489309a9AfA8e", +} diff --git a/src/utils/addresses/localNounsMinter_mumbai.ts b/src/utils/addresses/localNounsMinter_mumbai.ts index b9956f0b..a720bb65 100644 --- a/src/utils/addresses/localNounsMinter_mumbai.ts +++ b/src/utils/addresses/localNounsMinter_mumbai.ts @@ -1,3 +1,3 @@ export const addresses = { - localNounsMinter:"0x0d602965065c64e6d5d69834C246863472aac4A5", + localNounsMinter:"0x6e5dDcD0945b7Fe6494F6d7bD543347384814ffd", } diff --git a/src/utils/addresses/localNounsProvider_mainnet.ts b/src/utils/addresses/localNounsProvider_mainnet.ts new file mode 100644 index 00000000..ef23fa5a --- /dev/null +++ b/src/utils/addresses/localNounsProvider_mainnet.ts @@ -0,0 +1,3 @@ +export const addresses = { + localNounsProvider:"0xb1B709a43446cE2045125B4F1e7D2e9eC5317397", +} diff --git a/src/utils/addresses/localNounsProvider_mumbai.ts b/src/utils/addresses/localNounsProvider_mumbai.ts index 36843f0d..840c4426 100644 --- a/src/utils/addresses/localNounsProvider_mumbai.ts +++ b/src/utils/addresses/localNounsProvider_mumbai.ts @@ -1,3 +1,3 @@ export const addresses = { - localNounsProvider:"0xfB4Fa72bcA36e02E24D2081EcBcf8D6d071CCE03", + localNounsProvider:"0x3992767cF71D2731819fc7ea9c6f2a2Ed7099E8b", } diff --git a/src/utils/addresses/localNounsToken_mainnet.ts b/src/utils/addresses/localNounsToken_mainnet.ts new file mode 100644 index 00000000..3db76521 --- /dev/null +++ b/src/utils/addresses/localNounsToken_mainnet.ts @@ -0,0 +1,3 @@ +export const addresses = { + localNounsToken:"0xc2671e1a7f8baa09F84e0c68A90ce5DF1D0dbC6B", +} diff --git a/src/utils/addresses/localNounsToken_mumbai.ts b/src/utils/addresses/localNounsToken_mumbai.ts index c8683abf..35f3b493 100644 --- a/src/utils/addresses/localNounsToken_mumbai.ts +++ b/src/utils/addresses/localNounsToken_mumbai.ts @@ -1,3 +1,3 @@ export const addresses = { - localNounsToken:"0x4d21F695453D2d206D72A08086f0440A97A82125", + localNounsToken:"0x2B56dC724b7790e73FD8e2536f7118260aA880BE", } diff --git a/src/utils/addresses/localseeder_localhost.ts b/src/utils/addresses/localseeder_localhost.ts index 83de0f6d..89614cca 100644 --- a/src/utils/addresses/localseeder_localhost.ts +++ b/src/utils/addresses/localseeder_localhost.ts @@ -1,3 +1,3 @@ export const addresses = { - localseeder:"0xD8a5a9b31c3C0232E196d518E89Fd8bF83AcAd43", + localseeder:"0xd9140951d8aE6E5F625a02F5908535e16e3af964", } diff --git a/src/utils/addresses/localseeder_mumbai.ts b/src/utils/addresses/localseeder_mumbai.ts index bad495e6..61fd7a33 100644 --- a/src/utils/addresses/localseeder_mumbai.ts +++ b/src/utils/addresses/localseeder_mumbai.ts @@ -1,3 +1,3 @@ export const addresses = { - localseeder:"0x14E6BC05997989d6B5a1F2910Fe9eD4eC25F1294", + localseeder:"0x18Ef7201b771167f383A63CCFe5cE33BdA6d9876", } diff --git a/src/utils/addresses/nftDescriptor_mainnet.ts b/src/utils/addresses/nftDescriptor_mainnet.ts new file mode 100644 index 00000000..05c46ae9 --- /dev/null +++ b/src/utils/addresses/nftDescriptor_mainnet.ts @@ -0,0 +1,3 @@ +export const addresses = { + nftDescriptor:"0x0BBAd8c947210ab6284699605ce2a61780958264", +} diff --git a/src/utils/addresses/nftDescriptor_mumbai.ts b/src/utils/addresses/nftDescriptor_mumbai.ts index 26646f74..a6313951 100644 --- a/src/utils/addresses/nftDescriptor_mumbai.ts +++ b/src/utils/addresses/nftDescriptor_mumbai.ts @@ -1,3 +1,3 @@ export const addresses = { - nftDescriptor:"0x77dD7d8d4a7091a64c25Eb0127839ff1f467edCa", + nftDescriptor:"0x3f722983286418E8AB70d9536E552F262A74041f", } diff --git a/src/utils/addresses/nounsDescriptor_mainnet.ts b/src/utils/addresses/nounsDescriptor_mainnet.ts new file mode 100644 index 00000000..04203cfc --- /dev/null +++ b/src/utils/addresses/nounsDescriptor_mainnet.ts @@ -0,0 +1,3 @@ +export const addresses = { + nounsDescriptor:"0x0Cfdb3Ba1694c2bb2CFACB0339ad7b1Ae5932B63", +} diff --git a/src/utils/addresses/nounsDescriptor_mumbai.ts b/src/utils/addresses/nounsDescriptor_mumbai.ts index 908194a9..9d19d929 100644 --- a/src/utils/addresses/nounsDescriptor_mumbai.ts +++ b/src/utils/addresses/nounsDescriptor_mumbai.ts @@ -1,3 +1,3 @@ export const addresses = { - nounsDescriptor:"0xE61d3572FDc4Bd1A49fa8bc691E3A0650FF0DdfC", + nounsDescriptor:"0x070054Ac97Fb9f53d68C90acb6CA535E3c33f627", } diff --git a/src/utils/addresses/nounsSeeder_mumbai.ts b/src/utils/addresses/nounsSeeder_mumbai.ts index 8433cc5d..e7ee929c 100644 --- a/src/utils/addresses/nounsSeeder_mumbai.ts +++ b/src/utils/addresses/nounsSeeder_mumbai.ts @@ -1,3 +1,3 @@ export const addresses = { - nounsSeeder:"0x86c95EC4fA955505E0B904CFCF232E93e17a1c75", + nounsSeeder:"0x304861A6eD64b7f78C39243724d57b1e4b2B0D26", } diff --git a/src/utils/addresses/sample_localhost.ts b/src/utils/addresses/sample_localhost.ts index 153d86ba..fa1e2473 100644 --- a/src/utils/addresses/sample_localhost.ts +++ b/src/utils/addresses/sample_localhost.ts @@ -1,4 +1,4 @@ export const addresses = { - providerAddress:"0x7Cf4be31f546c04787886358b9486ca3d62B9acf", - sampleToken:"0x33E45b187da34826aBCEDA1039231Be46f1b05Af" + providerAddress:"0x70bDA08DBe07363968e9EE53d899dFE48560605B", + sampleToken:"0x26B862f640357268Bd2d9E95bc81553a2Aa81D7E" } diff --git a/src/utils/addresses/tokenGate_localhost.ts b/src/utils/addresses/tokenGate_localhost.ts index 92bb7403..f550177e 100644 --- a/src/utils/addresses/tokenGate_localhost.ts +++ b/src/utils/addresses/tokenGate_localhost.ts @@ -1,3 +1,3 @@ export const addresses = { - tokenGate: "0xb007167714e2940013EC3bb551584130B7497E22", -}; + tokenGate:"0xD8a5a9b31c3C0232E196d518E89Fd8bF83AcAd43", +} diff --git a/src/utils/addresses/tokenGate_mainnet.ts b/src/utils/addresses/tokenGate_mainnet.ts index 8738a631..3b5f39ac 100644 --- a/src/utils/addresses/tokenGate_mainnet.ts +++ b/src/utils/addresses/tokenGate_mainnet.ts @@ -1,3 +1,3 @@ export const addresses = { - tokenGate: "0xEDE1a69DB77c4CBa8d15F9170568959a56Ce9c05", -}; + tokenGate:"0x3bc86b35eD7D617498Da6F8dc351D71749dc595a", +} diff --git a/src/utils/addresses/tokenGate_mumbai.ts b/src/utils/addresses/tokenGate_mumbai.ts index 7504fb52..2dff4ec6 100644 --- a/src/utils/addresses/tokenGate_mumbai.ts +++ b/src/utils/addresses/tokenGate_mumbai.ts @@ -1,3 +1,3 @@ export const addresses = { - tokenGate: "0xD601E7E7138EDAfdC4FE9D2e3c7E8827D648DcEb", -}; + tokenGate:"0xd7133465F44814133a8369566deac4e97C804876", +}