|
|
|
from os import getenv
|
|
|
|
from dotenv import load_dotenv
|
|
|
|
|
|
|
|
load_dotenv()
|
|
|
|
|
|
|
|
# App
|
|
|
|
SECRET_KEY = getenv('SECRET_KEY', 'yyyyyyyyyyyyy')
|
|
|
|
DATA_FOLDER = getenv('DATA_FOLDER', '/path/to/uploads')
|
|
|
|
SERVER_NAME = getenv('SERVER_NAME', '127.0.0.1:5000')
|
|
|
|
IPFS_SERVER = getenv('IPFS_SERVER', 'http://127.0.0.1:8080')
|
|
|
|
AVAX_RPC = getenv('AVAX_RPC', 'https://api.avax-test.network/ext/bc/C/rpc')
|
|
|
|
|
|
|
|
# Cache
|
|
|
|
CACHE_HOST = getenv('CACHE_HOST', 'localhost')
|
|
|
|
CACHE_PORT = getenv('CACHE_PORT', 6379)
|
|
|
|
|
|
|
|
# Uploads
|
|
|
|
SESSION_TYPE = 'filesystem'
|
|
|
|
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif', 'svg', 'mp4', 'webp'}
|
|
|
|
MAX_CONTENT_LENGTH = 32 * 1024 * 1024
|
|
|
|
TEMPLATES_AUTO_RELOAD = getenv('TEMPLATES_AUTO_RELOAD', True)
|
|
|
|
|
|
|
|
# Contract
|
|
|
|
CONTRACT_TESTNET = getenv('TESTNET', True)
|
|
|
|
CONTRACT_ADDRESS = '0x9797afc5d0258704109f71109188fdcba19c24c2' # Fuji
|
|
|
|
CONTRACT_ABI = [
|
|
|
|
{
|
|
|
|
'inputs': [],
|
|
|
|
'stateMutability': 'nonpayable',
|
|
|
|
'type': 'constructor'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'anonymous': False,
|
|
|
|
'inputs': [
|
|
|
|
{
|
|
|
|
'indexed': True,
|
|
|
|
'internalType': 'address',
|
|
|
|
'name': 'owner',
|
|
|
|
'type': 'address'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'indexed': True,
|
|
|
|
'internalType': 'address',
|
|
|
|
'name': 'approved',
|
|
|
|
'type': 'address'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'indexed': True,
|
|
|
|
'internalType': 'uint256',
|
|
|
|
'name': 'tokenId',
|
|
|
|
'type': 'uint256'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'name': 'Approval',
|
|
|
|
'type': 'event'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'anonymous': False,
|
|
|
|
'inputs': [
|
|
|
|
{
|
|
|
|
'indexed': True,
|
|
|
|
'internalType': 'address',
|
|
|
|
'name': 'owner',
|
|
|
|
'type': 'address'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'indexed': True,
|
|
|
|
'internalType': 'address',
|
|
|
|
'name': 'operator',
|
|
|
|
'type': 'address'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'indexed': False,
|
|
|
|
'internalType': 'bool',
|
|
|
|
'name': 'approved',
|
|
|
|
'type': 'bool'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'name': 'ApprovalForAll',
|
|
|
|
'type': 'event'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'anonymous': False,
|
|
|
|
'inputs': [
|
|
|
|
{
|
|
|
|
'indexed': True,
|
|
|
|
'internalType': 'address',
|
|
|
|
'name': 'previousOwner',
|
|
|
|
'type': 'address'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'indexed': True,
|
|
|
|
'internalType': 'address',
|
|
|
|
'name': 'newOwner',
|
|
|
|
'type': 'address'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'name': 'OwnershipTransferred',
|
|
|
|
'type': 'event'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'anonymous': False,
|
|
|
|
'inputs': [
|
|
|
|
{
|
|
|
|
'indexed': True,
|
|
|
|
'internalType': 'address',
|
|
|
|
'name': 'from',
|
|
|
|
'type': 'address'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'indexed': True,
|
|
|
|
'internalType': 'address',
|
|
|
|
'name': 'to',
|
|
|
|
'type': 'address'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'indexed': True,
|
|
|
|
'internalType': 'uint256',
|
|
|
|
'name': 'tokenId',
|
|
|
|
'type': 'uint256'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'name': 'Transfer',
|
|
|
|
'type': 'event'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'inputs': [
|
|
|
|
{
|
|
|
|
'internalType': 'address',
|
|
|
|
'name': 'to',
|
|
|
|
'type': 'address'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'internalType': 'uint256',
|
|
|
|
'name': 'tokenId',
|
|
|
|
'type': 'uint256'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'name': 'approve',
|
|
|
|
'outputs': [],
|
|
|
|
'stateMutability': 'nonpayable',
|
|
|
|
'type': 'function'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'inputs': [
|
|
|
|
{
|
|
|
|
'internalType': 'address',
|
|
|
|
'name': 'owner',
|
|
|
|
'type': 'address'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'name': 'balanceOf',
|
|
|
|
'outputs': [
|
|
|
|
{
|
|
|
|
'internalType': 'uint256',
|
|
|
|
'name': '',
|
|
|
|
'type': 'uint256'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'stateMutability': 'view',
|
|
|
|
'type': 'function'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'inputs': [],
|
|
|
|
'name': 'contractCreator',
|
|
|
|
'outputs': [
|
|
|
|
{
|
|
|
|
'internalType': 'string',
|
|
|
|
'name': '',
|
|
|
|
'type': 'string'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'stateMutability': 'view',
|
|
|
|
'type': 'function'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'inputs': [],
|
|
|
|
'name': 'contractTipCutPercent',
|
|
|
|
'outputs': [
|
|
|
|
{
|
|
|
|
'internalType': 'uint256',
|
|
|
|
'name': '',
|
|
|
|
'type': 'uint256'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'stateMutability': 'view',
|
|
|
|
'type': 'function'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'inputs': [],
|
|
|
|
'name': 'contractVersion',
|
|
|
|
'outputs': [
|
|
|
|
{
|
|
|
|
'internalType': 'string',
|
|
|
|
'name': '',
|
|
|
|
'type': 'string'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'stateMutability': 'view',
|
|
|
|
'type': 'function'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'inputs': [
|
|
|
|
{
|
|
|
|
'internalType': 'uint256',
|
|
|
|
'name': 'tokenId',
|
|
|
|
'type': 'uint256'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'name': 'getApproved',
|
|
|
|
'outputs': [
|
|
|
|
{
|
|
|
|
'internalType': 'address',
|
|
|
|
'name': '',
|
|
|
|
'type': 'address'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'stateMutability': 'view',
|
|
|
|
'type': 'function'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'inputs': [
|
|
|
|
{
|
|
|
|
'internalType': 'address',
|
|
|
|
'name': 'owner',
|
|
|
|
'type': 'address'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'internalType': 'address',
|
|
|
|
'name': 'operator',
|
|
|
|
'type': 'address'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'name': 'isApprovedForAll',
|
|
|
|
'outputs': [
|
|
|
|
{
|
|
|
|
'internalType': 'bool',
|
|
|
|
'name': '',
|
|
|
|
'type': 'bool'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'stateMutability': 'view',
|
|
|
|
'type': 'function'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'inputs': [
|
|
|
|
{
|
|
|
|
'internalType': 'string',
|
|
|
|
'name': '',
|
|
|
|
'type': 'string'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'name': 'metadataTokenId',
|
|
|
|
'outputs': [
|
|
|
|
{
|
|
|
|
'internalType': 'uint256',
|
|
|
|
'name': '',
|
|
|
|
'type': 'uint256'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'stateMutability': 'view',
|
|
|
|
'type': 'function'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'inputs': [],
|
|
|
|
'name': 'name',
|
|
|
|
'outputs': [
|
|
|
|
{
|
|
|
|
'internalType': 'string',
|
|
|
|
'name': '',
|
|
|
|
'type': 'string'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'stateMutability': 'view',
|
|
|
|
'type': 'function'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'inputs': [],
|
|
|
|
'name': 'owner',
|
|
|
|
'outputs': [
|
|
|
|
{
|
|
|
|
'internalType': 'address',
|
|
|
|
'name': '',
|
|
|
|
'type': 'address'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'stateMutability': 'view',
|
|
|
|
'type': 'function'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'inputs': [
|
|
|
|
{
|
|
|
|
'internalType': 'uint256',
|
|
|
|
'name': 'tokenId',
|
|
|
|
'type': 'uint256'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'name': 'ownerOf',
|
|
|
|
'outputs': [
|
|
|
|
{
|
|
|
|
'internalType': 'address',
|
|
|
|
'name': '',
|
|
|
|
'type': 'address'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'stateMutability': 'view',
|
|
|
|
'type': 'function'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'inputs': [],
|
|
|
|
'name': 'publisherTipCutPercent',
|
|
|
|
'outputs': [
|
|
|
|
{
|
|
|
|
'internalType': 'uint256',
|
|
|
|
'name': '',
|
|
|
|
'type': 'uint256'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'stateMutability': 'view',
|
|
|
|
'type': 'function'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'inputs': [],
|
|
|
|
'name': 'renounceOwnership',
|
|
|
|
'outputs': [],
|
|
|
|
'stateMutability': 'nonpayable',
|
|
|
|
'type': 'function'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'inputs': [
|
|
|
|
{
|
|
|
|
'internalType': 'address',
|
|
|
|
'name': 'from',
|
|
|
|
'type': 'address'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'internalType': 'address',
|
|
|
|
'name': 'to',
|
|
|
|
'type': 'address'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'internalType': 'uint256',
|
|
|
|
'name': 'tokenId',
|
|
|
|
'type': 'uint256'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'name': 'safeTransferFrom',
|
|
|
|
'outputs': [],
|
|
|
|
'stateMutability': 'nonpayable',
|
|
|
|
'type': 'function'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'inputs': [
|
|
|
|
{
|
|
|
|
'internalType': 'address',
|
|
|
|
'name': 'from',
|
|
|
|
'type': 'address'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'internalType': 'address',
|
|
|
|
'name': 'to',
|
|
|
|
'type': 'address'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'internalType': 'uint256',
|
|
|
|
'name': 'tokenId',
|
|
|
|
'type': 'uint256'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'internalType': 'bytes',
|
|
|
|
'name': '_data',
|
|
|
|
'type': 'bytes'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'name': 'safeTransferFrom',
|
|
|
|
'outputs': [],
|
|
|
|
'stateMutability': 'nonpayable',
|
|
|
|
'type': 'function'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'inputs': [
|
|
|
|
{
|
|
|
|
'internalType': 'address',
|
|
|
|
'name': 'operator',
|
|
|
|
'type': 'address'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'internalType': 'bool',
|
|
|
|
'name': 'approved',
|
|
|
|
'type': 'bool'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'name': 'setApprovalForAll',
|
|
|
|
'outputs': [],
|
|
|
|
'stateMutability': 'nonpayable',
|
|
|
|
'type': 'function'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'inputs': [
|
|
|
|
{
|
|
|
|
'internalType': 'bytes4',
|
|
|
|
'name': 'interfaceId',
|
|
|
|
'type': 'bytes4'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'name': 'supportsInterface',
|
|
|
|
'outputs': [
|
|
|
|
{
|
|
|
|
'internalType': 'bool',
|
|
|
|
'name': '',
|
|
|
|
'type': 'bool'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'stateMutability': 'view',
|
|
|
|
'type': 'function'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'inputs': [],
|
|
|
|
'name': 'symbol',
|
|
|
|
'outputs': [
|
|
|
|
{
|
|
|
|
'internalType': 'string',
|
|
|
|
'name': '',
|
|
|
|
'type': 'string'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'stateMutability': 'view',
|
|
|
|
'type': 'function'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'inputs': [
|
|
|
|
{
|
|
|
|
'internalType': 'uint256',
|
|
|
|
'name': '',
|
|
|
|
'type': 'uint256'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'name': 'tokenMeme',
|
|
|
|
'outputs': [
|
|
|
|
{
|
|
|
|
'internalType': 'uint256',
|
|
|
|
'name': 'publisherTipsAVAX',
|
|
|
|
'type': 'uint256'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'internalType': 'uint256',
|
|
|
|
'name': 'creatorTipsAVAX',
|
|
|
|
'type': 'uint256'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'internalType': 'uint256',
|
|
|
|
'name': 'contractTipsAVAX',
|
|
|
|
'type': 'uint256'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'internalType': 'address',
|
|
|
|
'name': 'publisherAddress',
|
|
|
|
'type': 'address'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'internalType': 'address',
|
|
|
|
'name': 'creatorAddress',
|
|
|
|
'type': 'address'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'internalType': 'string',
|
|
|
|
'name': 'metadataIPFSHash',
|
|
|
|
'type': 'string'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'stateMutability': 'view',
|
|
|
|
'type': 'function'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'inputs': [
|
|
|
|
{
|
|
|
|
'internalType': 'address',
|
|
|
|
'name': 'from',
|
|
|
|
'type': 'address'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'internalType': 'address',
|
|
|
|
'name': 'to',
|
|
|
|
'type': 'address'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'internalType': 'uint256',
|
|
|
|
'name': 'tokenId',
|
|
|
|
'type': 'uint256'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'name': 'transferFrom',
|
|
|
|
'outputs': [],
|
|
|
|
'stateMutability': 'nonpayable',
|
|
|
|
'type': 'function'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'inputs': [
|
|
|
|
{
|
|
|
|
'internalType': 'address',
|
|
|
|
'name': 'newOwner',
|
|
|
|
'type': 'address'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'name': 'transferOwnership',
|
|
|
|
'outputs': [],
|
|
|
|
'stateMutability': 'nonpayable',
|
|
|
|
'type': 'function'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'inputs': [
|
|
|
|
{
|
|
|
|
'internalType': 'address',
|
|
|
|
'name': '',
|
|
|
|
'type': 'address'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'name': 'userProfile',
|
|
|
|
'outputs': [
|
|
|
|
{
|
|
|
|
'internalType': 'string',
|
|
|
|
'name': 'wowneroAddress',
|
|
|
|
'type': 'string'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'internalType': 'string',
|
|
|
|
'name': 'userHandle',
|
|
|
|
'type': 'string'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'internalType': 'string',
|
|
|
|
'name': 'metadataIPFSHash',
|
|
|
|
'type': 'string'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'internalType': 'uint256',
|
|
|
|
'name': 'tippedAVAX',
|
|
|
|
'type': 'uint256'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'stateMutability': 'view',
|
|
|
|
'type': 'function'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'inputs': [],
|
|
|
|
'name': 'withdraw',
|
|
|
|
'outputs': [],
|
|
|
|
'stateMutability': 'nonpayable',
|
|
|
|
'type': 'function'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'inputs': [
|
|
|
|
{
|
|
|
|
'internalType': 'uint256',
|
|
|
|
'name': 'percent',
|
|
|
|
'type': 'uint256'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'name': 'setContractTipCut',
|
|
|
|
'outputs': [],
|
|
|
|
'stateMutability': 'nonpayable',
|
|
|
|
'type': 'function'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'inputs': [
|
|
|
|
{
|
|
|
|
'internalType': 'uint256',
|
|
|
|
'name': 'percent',
|
|
|
|
'type': 'uint256'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'name': 'setPublisherTipCut',
|
|
|
|
'outputs': [],
|
|
|
|
'stateMutability': 'nonpayable',
|
|
|
|
'type': 'function'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'inputs': [],
|
|
|
|
'name': 'totalSupply',
|
|
|
|
'outputs': [
|
|
|
|
{
|
|
|
|
'internalType': 'uint256',
|
|
|
|
'name': '',
|
|
|
|
'type': 'uint256'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'stateMutability': 'view',
|
|
|
|
'type': 'function'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'inputs': [
|
|
|
|
{
|
|
|
|
'internalType': 'string',
|
|
|
|
'name': 'wowneroAddress',
|
|
|
|
'type': 'string'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'name': 'setUserWowneroAddress',
|
|
|
|
'outputs': [],
|
|
|
|
'stateMutability': 'nonpayable',
|
|
|
|
'type': 'function'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'inputs': [
|
|
|
|
{
|
|
|
|
'internalType': 'string',
|
|
|
|
'name': 'handle',
|
|
|
|
'type': 'string'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'name': 'setUserHandle',
|
|
|
|
'outputs': [],
|
|
|
|
'stateMutability': 'nonpayable',
|
|
|
|
'type': 'function'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'inputs': [
|
|
|
|
{
|
|
|
|
'internalType': 'string',
|
|
|
|
'name': 'metadataIPFSHash',
|
|
|
|
'type': 'string'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'name': 'setUserMetadata',
|
|
|
|
'outputs': [],
|
|
|
|
'stateMutability': 'nonpayable',
|
|
|
|
'type': 'function'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'inputs': [
|
|
|
|
{
|
|
|
|
'internalType': 'string',
|
|
|
|
'name': 'metadataIPFSHash',
|
|
|
|
'type': 'string'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'internalType': 'address',
|
|
|
|
'name': 'creatorAddress',
|
|
|
|
'type': 'address'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'name': 'mint',
|
|
|
|
'outputs': [],
|
|
|
|
'stateMutability': 'nonpayable',
|
|
|
|
'type': 'function'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'inputs': [
|
|
|
|
{
|
|
|
|
'internalType': 'uint256',
|
|
|
|
'name': 'tokenId',
|
|
|
|
'type': 'uint256'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'name': 'tipAVAX',
|
|
|
|
'outputs': [],
|
|
|
|
'stateMutability': 'payable',
|
|
|
|
'type': 'function'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
'inputs': [
|
|
|
|
{
|
|
|
|
'internalType': 'uint256',
|
|
|
|
'name': 'tokenId',
|
|
|
|
'type': 'uint256'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'name': 'tokenURI',
|
|
|
|
'outputs': [
|
|
|
|
{
|
|
|
|
'internalType': 'string',
|
|
|
|
'name': '',
|
|
|
|
'type': 'string'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
'stateMutability': 'view',
|
|
|
|
'type': 'function'
|
|
|
|
}
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
# Logging
|
|
|
|
LOGGING_CONFIG = {
|
|
|
|
'version': 1,
|
|
|
|
'formatters': {'default': {
|
|
|
|
'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s',
|
|
|
|
}},
|
|
|
|
'handlers': {
|
|
|
|
'console': {
|
|
|
|
'level': 'INFO',
|
|
|
|
'class': 'logging.StreamHandler',
|
|
|
|
'formatter': 'default',
|
|
|
|
'stream': 'ext://sys.stdout',
|
|
|
|
},
|
|
|
|
'wsgi': {
|
|
|
|
'class': 'logging.StreamHandler',
|
|
|
|
'stream': 'ext://flask.logging.wsgi_errors_stream',
|
|
|
|
'formatter': 'default'
|
|
|
|
}
|
|
|
|
},
|
|
|
|
'loggers': {
|
|
|
|
'gunicorn.error': {
|
|
|
|
'handlers': ['console'],
|
|
|
|
'level': 'INFO',
|
|
|
|
'propagate': False,
|
|
|
|
},
|
|
|
|
'gunicorn.access': {
|
|
|
|
'handlers': ['console'],
|
|
|
|
'level': 'INFO',
|
|
|
|
'propagate': False,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
'root': {
|
|
|
|
'level': 'DEBUG',
|
|
|
|
'handlers': ['console'],
|
|
|
|
}
|
|
|
|
}
|