diff --git a/abis-supplemental/ERC20.json b/abis-supplemental/ERC20.json new file mode 100644 index 00000000..5745e6ab --- /dev/null +++ b/abis-supplemental/ERC20.json @@ -0,0 +1,297 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ERC20", + "sourceName": "@openzeppelin-4.5/contracts/token/ERC20/ERC20.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "string", + "name": "name_", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol_", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60806040523480156200001157600080fd5b5060405162000b9a38038062000b9a833981016040819052620000349162000122565b60036200004283826200021d565b5060046200005182826200021d565b505050620002e9565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200008257600080fd5b81516001600160401b03808211156200009f576200009f6200005a565b604051601f8301601f19908116603f01168101908282118183101715620000ca57620000ca6200005a565b8160405283815260209250866020858801011115620000e857600080fd5b600091505b838210156200010c5785820183015181830184015290820190620000ed565b6000602085830101528094505050505092915050565b600080604083850312156200013657600080fd5b82516001600160401b03808211156200014e57600080fd5b6200015c8683870162000070565b935060208501519150808211156200017357600080fd5b50620001828582860162000070565b9150509250929050565b600181811c90821680620001a157607f821691505b602082108103620001c257634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000218576000816000526020600020601f850160051c81016020861015620001f35750805b601f850160051c820191505b818110156200021457828155600101620001ff565b5050505b505050565b81516001600160401b038111156200023957620002396200005a565b62000251816200024a84546200018c565b84620001c8565b602080601f831160018114620002895760008415620002705750858301515b600019600386901b1c1916600185901b17855562000214565b600085815260208120601f198616915b82811015620002ba5788860151825594840194600190910190840162000299565b5085821015620002d95787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6108a180620002f96000396000f3fe608060405234801561001057600080fd5b50600436106100995760003560e01c806306fdde031461009e578063095ea7b3146100bc57806318160ddd146100df57806323b872dd146100f1578063313ce56714610104578063395093511461011357806370a082311461012657806395d89b411461014f578063a457c2d714610157578063a9059cbb1461016a578063dd62ed3e1461017d575b600080fd5b6100a6610190565b6040516100b391906106ea565b60405180910390f35b6100cf6100ca366004610755565b610222565b60405190151581526020016100b3565b6002545b6040519081526020016100b3565b6100cf6100ff36600461077f565b61023c565b604051601281526020016100b3565b6100cf610121366004610755565b610260565b6100e36101343660046107bb565b6001600160a01b031660009081526020819052604090205490565b6100a661029f565b6100cf610165366004610755565b6102ae565b6100cf610178366004610755565b610345565b6100e361018b3660046107dd565b610353565b60606003805461019f90610810565b80601f01602080910402602001604051908101604052809291908181526020018280546101cb90610810565b80156102185780601f106101ed57610100808354040283529160200191610218565b820191906000526020600020905b8154815290600101906020018083116101fb57829003601f168201915b5050505050905090565b60003361023081858561037e565b60019150505b92915050565b60003361024a8582856104a2565b61025585858561051c565b506001949350505050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190610230908290869061029a90879061084a565b61037e565b60606004805461019f90610810565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190838110156103385760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b610255828686840361037e565b60003361023081858561051c565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166103e05760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161032f565b6001600160a01b0382166104415760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161032f565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006104ae8484610353565b9050600019811461051657818110156105095760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161032f565b610516848484840361037e565b50505050565b6001600160a01b0383166105805760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161032f565b6001600160a01b0382166105e25760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161032f565b6001600160a01b0383166000908152602081905260409020548181101561065a5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161032f565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061069190849061084a565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516106dd91815260200190565b60405180910390a3610516565b60006020808352835180602085015260005b81811015610718578581018301518582016040015282016106fc565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461075057600080fd5b919050565b6000806040838503121561076857600080fd5b61077183610739565b946020939093013593505050565b60008060006060848603121561079457600080fd5b61079d84610739565b92506107ab60208501610739565b9150604084013590509250925092565b6000602082840312156107cd57600080fd5b6107d682610739565b9392505050565b600080604083850312156107f057600080fd5b6107f983610739565b915061080760208401610739565b90509250929050565b600181811c9082168061082457607f821691505b60208210810361084457634e487b7160e01b600052602260045260246000fd5b50919050565b8082018082111561023657634e487b7160e01b600052601160045260246000fdfea264697066735822122049a5db68a8391bae53e4d0bed3df8870c4083fcf6de9b9bec8816f501f2cbc3e64736f6c63430008160033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100995760003560e01c806306fdde031461009e578063095ea7b3146100bc57806318160ddd146100df57806323b872dd146100f1578063313ce56714610104578063395093511461011357806370a082311461012657806395d89b411461014f578063a457c2d714610157578063a9059cbb1461016a578063dd62ed3e1461017d575b600080fd5b6100a6610190565b6040516100b391906106ea565b60405180910390f35b6100cf6100ca366004610755565b610222565b60405190151581526020016100b3565b6002545b6040519081526020016100b3565b6100cf6100ff36600461077f565b61023c565b604051601281526020016100b3565b6100cf610121366004610755565b610260565b6100e36101343660046107bb565b6001600160a01b031660009081526020819052604090205490565b6100a661029f565b6100cf610165366004610755565b6102ae565b6100cf610178366004610755565b610345565b6100e361018b3660046107dd565b610353565b60606003805461019f90610810565b80601f01602080910402602001604051908101604052809291908181526020018280546101cb90610810565b80156102185780601f106101ed57610100808354040283529160200191610218565b820191906000526020600020905b8154815290600101906020018083116101fb57829003601f168201915b5050505050905090565b60003361023081858561037e565b60019150505b92915050565b60003361024a8582856104a2565b61025585858561051c565b506001949350505050565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190610230908290869061029a90879061084a565b61037e565b60606004805461019f90610810565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190838110156103385760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b610255828686840361037e565b60003361023081858561051c565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166103e05760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161032f565b6001600160a01b0382166104415760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161032f565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006104ae8484610353565b9050600019811461051657818110156105095760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161032f565b610516848484840361037e565b50505050565b6001600160a01b0383166105805760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161032f565b6001600160a01b0382166105e25760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161032f565b6001600160a01b0383166000908152602081905260409020548181101561065a5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161032f565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061069190849061084a565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516106dd91815260200190565b60405180910390a3610516565b60006020808352835180602085015260005b81811015610718578581018301518582016040015282016106fc565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461075057600080fd5b919050565b6000806040838503121561076857600080fd5b61077183610739565b946020939093013593505050565b60008060006060848603121561079457600080fd5b61079d84610739565b92506107ab60208501610739565b9150604084013590509250925092565b6000602082840312156107cd57600080fd5b6107d682610739565b9392505050565b600080604083850312156107f057600080fd5b6107f983610739565b915061080760208401610739565b90509250929050565b600181811c9082168061082457607f821691505b60208210810361084457634e487b7160e01b600052602260045260246000fd5b50919050565b8082018082111561023657634e487b7160e01b600052601160045260246000fdfea264697066735822122049a5db68a8391bae53e4d0bed3df8870c4083fcf6de9b9bec8816f501f2cbc3e64736f6c63430008160033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/package.json b/package.json index f5b0c240..b8886a69 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "@assemblyscript/loader": "^0.19.22", "@graphprotocol/graph-cli": "^0.56.0", "@graphprotocol/graph-ts": "^0.27.0", - "matchstick-as": "^0.5.0" + "matchstick-as": "^0.6.0" }, "devDependencies": { "assemblyscript": "^0.19.22", diff --git a/schema.graphql b/schema.graphql index 40bb3faf..fe3549e0 100644 --- a/schema.graphql +++ b/schema.graphql @@ -56,6 +56,9 @@ type Project @entity { "Currency symbol for ERC-20" currencySymbol: String + "Number of decimals used to get a currency's display representation (i.e. 18 for ETH)" + currencyDecimals: Int + "Artist description of the project" description: String @@ -409,6 +412,9 @@ type PrimaryPurchase @entity { "Symbol of currency used to purchase token" currencySymbol: String + + "Number of decimals used to get a currency's display representation (i.e. 18 for ETH)" + currencyDecimals: Int } type MinterFilter @entity { @@ -501,6 +507,9 @@ type ProjectMinterConfiguration @entity { "currency address as defined on minter - address(0) reserved for ether" currencyAddress: Bytes! + "number of decimals used to get a currency's display representation (i.e. 18 for ETH)" + currencyDecimals: Int! + "Defines if purchasing token to another is allowed" purchaseToDisabled: Boolean! diff --git a/src/helpers.ts b/src/helpers.ts index 8623fb40..d7c89def 100644 --- a/src/helpers.ts +++ b/src/helpers.ts @@ -539,6 +539,7 @@ export function loadOrCreateProjectMinterConfiguration( projectMinterConfig.priceIsConfigured = false; projectMinterConfig.currencySymbol = "ETH"; projectMinterConfig.currencyAddress = Address.zero(); + projectMinterConfig.currencyDecimals = 18; projectMinterConfig.purchaseToDisabled = false; projectMinterConfig.extraMinterDetails = "{}"; projectMinterConfig.save(); @@ -924,6 +925,7 @@ export function createPrimaryPurchaseDetailsFromTokenMint( ); purchaseDetails.currencyAddress = minterConfig.currencyAddress; purchaseDetails.currencySymbol = minterConfig.currencySymbol; + purchaseDetails.currencyDecimals = minterConfig.currencyDecimals; purchaseDetails.save(); return purchaseDetails.id; @@ -953,6 +955,7 @@ export function createPrimaryPurchaseDetailsFromTokenMint( purchaseDetails.currencyAddress = project.currencyAddress || Address.zero(); purchaseDetails.currencySymbol = project.currencySymbol || "ETH"; + purchaseDetails.currencyDecimals = project.currencyDecimals || 18; purchaseDetails.save(); return purchaseDetails.id; diff --git a/src/legacy-minter-suite-mapping.ts b/src/legacy-minter-suite-mapping.ts index 69ba488d..27fcc3ce 100644 --- a/src/legacy-minter-suite-mapping.ts +++ b/src/legacy-minter-suite-mapping.ts @@ -119,6 +119,8 @@ import { import { createTypedMapFromEntries, toJSONValue } from "./json"; +import { ERC20 } from "../generated/MinterSetPriceERC20/ERC20"; + // IFilteredMinterV0 events export function handlePricePerTokenInWeiUpdated( event: PricePerTokenInWeiUpdated @@ -162,6 +164,15 @@ export function handleProjectCurrencyInfoUpdated( projectMinterConfig.currencyAddress = event.params._currencyAddress; projectMinterConfig.currencySymbol = event.params._currencySymbol; + + const erc20Contract = ERC20.bind(event.params._currencyAddress); + const decimalsResult = erc20Contract.try_decimals(); + if (!decimalsResult.reverted) { + projectMinterConfig.currencyDecimals = decimalsResult.value; + } else { + projectMinterConfig.currencyDecimals = 18; + } + projectMinterConfig.save(); project.updatedAt = event.block.timestamp; @@ -1246,6 +1257,7 @@ function loadMinterProjectAndConfigLegacyMinters( projectMinterConfig.priceIsConfigured = false; projectMinterConfig.currencySymbol = "ETH"; projectMinterConfig.currencyAddress = Address.zero(); + projectMinterConfig.currencyDecimals = 18; projectMinterConfig.purchaseToDisabled = false; projectMinterConfig.extraMinterDetails = "{}"; projectMinterConfig.save(); diff --git a/src/mapping-v0-core.ts b/src/mapping-v0-core.ts index 1866e0c9..7ccc2b22 100644 --- a/src/mapping-v0-core.ts +++ b/src/mapping-v0-core.ts @@ -107,6 +107,7 @@ export function handleMint(event: Mint): void { primaryPurchaseDetails.minterAddress = event.address; primaryPurchaseDetails.currencyAddress = Address.zero(); primaryPurchaseDetails.currencySymbol = "ETH"; + primaryPurchaseDetails.currencyDecimals = 18; primaryPurchaseDetails.save(); token.primaryPurchaseDetails = primaryPurchaseDetails.id; @@ -251,6 +252,7 @@ export function handleAddProject(call: AddProjectCall): void { project.createdAt = call.block.timestamp; project.currencyAddress = Address.zero(); project.currencySymbol = "ETH"; + project.currencyDecimals = 18; project.dynamic = dynamic; project.externalAssetDependencyCount = BigInt.fromI32(0); project.externalAssetDependenciesLocked = false; diff --git a/src/mapping-v1-core.ts b/src/mapping-v1-core.ts index fbb7a14a..85577cc2 100644 --- a/src/mapping-v1-core.ts +++ b/src/mapping-v1-core.ts @@ -76,6 +76,7 @@ import { createPrimaryPurchaseDetailsFromTokenMint } from "./helpers"; import { GEN_ART_721_CORE_V1 } from "./constants"; +import { ERC20 } from "../generated/MinterSetPriceERC20/ERC20"; /*** EVENT HANDLERS ***/ export function handleMint(event: Mint): void { @@ -242,6 +243,14 @@ export function handleAddProject(call: AddProjectCall): void { let maxInvocations = projectTokenInfo.value3; let currencyAddress = projectTokenInfo.value5; let currencySymbol = projectTokenInfo.value7; + let currencyDecimals = 18; + if (currencyAddress != Address.zero()) { + let currencyContract = ERC20.bind(currencyAddress); + let decimals = currencyContract.try_decimals(); + if (!decimals.reverted) { + currencyDecimals = decimals.value; + } + } let scriptCount = projectScriptInfo.value1; let useHashString = projectScriptInfo.value2; @@ -259,6 +268,7 @@ export function handleAddProject(call: AddProjectCall): void { project.createdAt = timestamp; project.currencySymbol = currencySymbol; project.currencyAddress = currencyAddress; + project.currencyDecimals = currencyDecimals; project.dynamic = dynamic; project.externalAssetDependencyCount = BigInt.fromI32(0); project.externalAssetDependenciesLocked = false; @@ -589,6 +599,15 @@ export function handleUpdateProjectCurrencyInfo( if (project) { project.currencySymbol = call.inputs._currencySymbol; project.currencyAddress = call.inputs._currencyAddress; + + if (call.inputs._currencyAddress != Address.zero()) { + let currencyContract = ERC20.bind(call.inputs._currencyAddress); + let decimals = currencyContract.try_decimals(); + if (!decimals.reverted) { + project.currencyDecimals = decimals.value; + } + } + project.updatedAt = call.block.timestamp; project.save(); } diff --git a/src/mapping-v2-core.ts b/src/mapping-v2-core.ts index b7fe74fa..f32673a5 100644 --- a/src/mapping-v2-core.ts +++ b/src/mapping-v2-core.ts @@ -77,6 +77,7 @@ import { FLEX_CONTRACT_EXTERNAL_ASSET_DEP_TYPES, GEN_ART_721_CORE_V2 } from "./constants"; +import { ERC20 } from "../generated/MinterSetPriceERC20/ERC20"; /*** EVENT HANDLERS ***/ export function handleMint(event: Mint): void { @@ -380,6 +381,14 @@ export function handleAddProject(call: AddProjectCall): void { let maxInvocations = projectTokenInfo.value3; let currencySymbol = projectTokenInfo.value7; let currencyAddress = projectTokenInfo.value8; + let currencyDecimals = 18; + if (currencyAddress != Address.zero()) { + let currencyContract = ERC20.bind(currencyAddress); + let decimals = currencyContract.try_decimals(); + if (!decimals.reverted) { + currencyDecimals = decimals.value; + } + } let scriptCount = projectScriptInfo.value1; let useHashString = true; @@ -396,6 +405,7 @@ export function handleAddProject(call: AddProjectCall): void { project.contract = contractAddress.toHexString(); project.createdAt = timestamp; project.currencyAddress = currencyAddress; + project.currencyDecimals = currencyDecimals; project.currencySymbol = currencySymbol; project.dynamic = dynamic; project.externalAssetDependencyCount = BigInt.fromI32(0); @@ -621,6 +631,15 @@ export function handleUpdateProjectCurrencyInfo( if (project) { project.currencySymbol = call.inputs._currencySymbol; project.currencyAddress = call.inputs._currencyAddress; + project.currencyDecimals = 18; + if (call.inputs._currencyAddress != Address.zero()) { + let currencyContract = ERC20.bind(call.inputs._currencyAddress); + let decimals = currencyContract.try_decimals(); + if (!decimals.reverted) { + project.currencyDecimals = decimals.value; + } + } + project.updatedAt = call.block.timestamp; project.save(); diff --git a/src/mapping-v3-core.ts b/src/mapping-v3-core.ts index 884a9cdd..176b87dc 100644 --- a/src/mapping-v3-core.ts +++ b/src/mapping-v3-core.ts @@ -688,8 +688,6 @@ function createProject( let pricePerTokenInWei = BigInt.fromI32(0); let invocations = projectStateData.value.getInvocations(); let maxInvocations = projectStateData.value.getMaxInvocations(); - let currencySymbol = "ETH"; - let currencyAddress = Address.zero(); let scriptCount = projectScriptDetails.value.getScriptCount(); let useHashString = true; @@ -706,8 +704,6 @@ function createProject( project.complete = false; project.contract = contractAddress; project.createdAt = timestamp; - project.currencyAddress = currencyAddress; - project.currencySymbol = currencySymbol; project.dynamic = true; project.externalAssetDependencyCount = BigInt.fromI32(0); project.externalAssetDependenciesLocked = false; diff --git a/src/split-funds-lib-mapping.ts b/src/split-funds-lib-mapping.ts index 5fda6f39..aa9a59f2 100644 --- a/src/split-funds-lib-mapping.ts +++ b/src/split-funds-lib-mapping.ts @@ -6,6 +6,7 @@ import { ProjectCurrencyInfoUpdated } from "../generated/SplitFundsLib/SplitFund import { updateProjectIfMinterConfigIsActive } from "./helpers"; import { loadOrCreateMinterProjectAndConfigIfProject } from "./generic-minter-events-lib-mapping"; +import { ERC20 } from "../generated/MinterSetPriceERC20/ERC20"; /////////////////////////////////////////////////////////////////////////////// // EVENT HANDLERS start here @@ -33,6 +34,15 @@ export function handleProjectCurrencyInfoUpdated( const projectMinterConfig = minterProjectAndConfig.projectMinterConfiguration; projectMinterConfig.currencyAddress = event.params.currencyAddress; projectMinterConfig.currencySymbol = event.params.currencySymbol; + projectMinterConfig.currencyDecimals = 18; + if (event.params.currencyAddress != Address.zero()) { + let currencyContract = ERC20.bind(event.params.currencyAddress); + let decimals = currencyContract.try_decimals(); + if (!decimals.reverted) { + projectMinterConfig.currencyDecimals = decimals.value; + } + } + projectMinterConfig.save(); // induce sync if the project minter configuration is the active one diff --git a/subgraph.template.yaml b/subgraph.template.yaml index eaeec861..f6ed7d04 100644 --- a/subgraph.template.yaml +++ b/subgraph.template.yaml @@ -47,6 +47,8 @@ dataSources: file: ./abis/GenArt721CoreV3_Engine.json - name: IERC721 file: ./abis/IERC721.json + - name: ERC20 + file: ./abis/ERC20.json - name: Ownable file: ./abis/Ownable.json - name: IAdminACLV0 @@ -123,6 +125,8 @@ dataSources: file: ./abis/GenArt721CoreV3_Engine.json - name: IERC721 file: ./abis/IERC721.json + - name: ERC20 + file: ./abis/ERC20.json - name: Ownable file: ./abis/Ownable.json - name: IAdminACLV0 @@ -207,6 +211,8 @@ dataSources: file: ./abis/GenArt721CoreV3_Engine.json - name: IERC721 file: ./abis/IERC721.json + - name: ERC20 + file: ./abis/ERC20.json - name: Ownable file: ./abis/Ownable.json - name: IAdminACLV0 @@ -277,6 +283,8 @@ dataSources: file: ./abis/GenArt721CoreV3_Engine.json - name: IERC721 file: ./abis/IERC721.json + - name: ERC20 + file: ./abis/ERC20.json - name: Ownable file: ./abis/Ownable.json - name: IAdminACLV0 @@ -329,6 +337,8 @@ dataSources: abis: - name: GenArt721Core file: ./abis/GenArt721Core.json + - name: ERC20 + file: ./abis/ERC20.json eventHandlers: - event: Mint(indexed address,indexed uint256,indexed uint256) handler: handleMint @@ -434,6 +444,8 @@ dataSources: file: ./abis/GenArt721Core2.json - name: GenArt721Core file: ./abis/GenArt721Core.json + - name: ERC20 + file: ./abis/ERC20.json eventHandlers: - event: Mint(indexed address,indexed uint256,indexed uint256) handler: handleMint @@ -539,6 +551,8 @@ dataSources: abis: - name: GenArt721Core2PBAB file: ./abis/GenArt721Core2PBAB.json + - name: ERC20 + file: ./abis/ERC20.json eventHandlers: - event: Mint(indexed address,indexed uint256,indexed uint256) handler: handleMint @@ -635,6 +649,8 @@ dataSources: file: ./abis/GenArt721Core2EngineFlex.json - name: GenArt721Core2PBAB file: ./abis/GenArt721Core2PBAB.json + - name: ERC20 + file: ./abis/ERC20.json eventHandlers: - event: Mint(indexed address,indexed uint256,indexed uint256) handler: handleMint @@ -736,6 +752,8 @@ dataSources: abis: - name: GenArt721 file: ./abis/GenArt721.json + - name: ERC20 + file: ./abis/ERC20.json eventHandlers: - event: Mint(indexed address,indexed uint256,indexed uint256,uint256,uint256) handler: handleMint @@ -1126,6 +1144,8 @@ dataSources: file: ./abis/IFilteredMinterMerkleV2.json - name: IFilteredMinterSEAV0 file: ./abis/IFilteredMinterSEAV0.json + - name: ERC20 + file: ./abis/ERC20.json eventHandlers: - event: ProjectCurrencyInfoUpdated(indexed uint256,indexed address,indexed address,string) handler: handleProjectCurrencyInfoUpdated @@ -1175,6 +1195,8 @@ dataSources: file: ./abis/IFilteredMinterMerkleV2.json - name: IFilteredMinterSEAV0 file: ./abis/IFilteredMinterSEAV0.json + - name: ERC20 + file: ./abis/ERC20.json eventHandlers: - event: PricePerTokenUpdated(indexed uint256,indexed address,indexed uint256) handler: handlePricePerTokenUpdated @@ -1226,6 +1248,8 @@ dataSources: file: ./abis/IFilteredMinterMerkleV2.json - name: IFilteredMinterSEAV0 file: ./abis/IFilteredMinterSEAV0.json + - name: ERC20 + file: ./abis/ERC20.json eventHandlers: - event: ProjectMaxInvocationsLimitUpdated(indexed uint256,indexed address,uint256) handler: handleProjectMaxInvocationsLimitUpdated @@ -1277,6 +1301,8 @@ dataSources: file: ./abis/IFilteredMinterMerkleV2.json - name: IFilteredMinterSEAV0 file: ./abis/IFilteredMinterSEAV0.json + - name: ERC20 + file: ./abis/ERC20.json eventHandlers: - event: DefaultMaxInvocationsPerAddress(uint256) handler: handleDefaultMaxInvocationsPerAddress @@ -1330,6 +1356,8 @@ dataSources: file: ./abis/IFilteredMinterMerkleV2.json - name: IFilteredMinterSEAV0 file: ./abis/IFilteredMinterSEAV0.json + - name: ERC20 + file: ./abis/ERC20.json eventHandlers: - event: DelegationRegistryUpdated(address) handler: handleDelegationRegistryUpdated @@ -1385,6 +1413,8 @@ dataSources: file: ./abis/IFilteredMinterMerkleV2.json - name: IFilteredMinterSEAV0 file: ./abis/IFilteredMinterSEAV0.json + - name: ERC20 + file: ./abis/ERC20.json eventHandlers: - event: MinAuctionDurationSecondsUpdated(uint256) handler: handleMinAuctionDurationSecondsUpdated @@ -1454,6 +1484,8 @@ dataSources: file: ./abis/IFilteredMinterHolderV2.json - name: IFilteredMinterMerkleV2 file: ./abis/IFilteredMinterMerkleV2.json + - name: ERC20 + file: ./abis/ERC20.json eventHandlers: - event: AuctionBufferTimeParamsUpdated(uint256,uint256) handler: handleAuctionBufferTimeParamsUpdated @@ -1529,6 +1561,8 @@ dataSources: file: ./abis/IFilteredMinterMerkleV2.json - name: IFilteredMinterSEAV0 file: ./abis/IFilteredMinterSEAV0.json + - name: ERC20 + file: ./abis/ERC20.json eventHandlers: - event: ResetAuctionDetails(indexed uint256,indexed address) handler: handleResetAuctionDetails @@ -1582,6 +1616,8 @@ dataSources: file: ./abis/IFilteredMinterMerkleV2.json - name: IFilteredMinterSEAV0 file: ./abis/IFilteredMinterSEAV0.json + - name: ERC20 + file: ./abis/ERC20.json eventHandlers: - event: SetAuctionDetailsExp(indexed uint256,indexed address,uint40,uint40,uint256,uint256) handler: handleSetAuctionDetailsExp @@ -1637,6 +1673,8 @@ dataSources: file: ./abis/IFilteredMinterMerkleV2.json - name: IFilteredMinterSEAV0 file: ./abis/IFilteredMinterSEAV0.json + - name: ERC20 + file: ./abis/ERC20.json eventHandlers: - event: SetAuctionDetailsLin(indexed uint256,indexed address,uint40,uint40,uint256,uint256) handler: handleSetAuctionDetailsLin @@ -1694,6 +1732,8 @@ dataSources: file: ./abis/IFilteredMinterMerkleV2.json - name: IFilteredMinterSEAV0 file: ./abis/IFilteredMinterSEAV0.json + - name: ERC20 + file: ./abis/ERC20.json eventHandlers: - event: ReceiptUpdated(indexed address,indexed uint256,indexed address,uint24,uint256) handler: handleReceiptUpdated @@ -1739,6 +1779,8 @@ dataSources: file: ./abis/IFilteredMinterMerkleV2.json - name: IFilteredMinterSEAV0 file: ./abis/IFilteredMinterSEAV0.json + - name: ERC20 + file: ./abis/ERC20.json eventHandlers: - event: PricePerTokenInWeiUpdated(indexed uint256,indexed uint256) handler: handlePricePerTokenInWeiUpdated @@ -1785,6 +1827,8 @@ dataSources: file: ./abis/IFilteredMinterMerkleV2.json - name: IFilteredMinterSEAV0 file: ./abis/IFilteredMinterSEAV0.json + - name: ERC20 + file: ./abis/ERC20.json eventHandlers: - event: PricePerTokenInWeiUpdated(indexed uint256,indexed uint256) handler: handlePricePerTokenInWeiUpdated @@ -1831,6 +1875,8 @@ dataSources: file: ./abis/IFilteredMinterMerkleV2.json - name: IFilteredMinterSEAV0 file: ./abis/IFilteredMinterSEAV0.json + - name: ERC20 + file: ./abis/ERC20.json eventHandlers: - event: AuctionHalfLifeRangeSecondsUpdated(uint256,uint256) handler: handleAuctionHalfLifeRangeSecondsUpdated @@ -1883,6 +1929,8 @@ dataSources: file: ./abis/IFilteredMinterMerkleV2.json - name: IFilteredMinterSEAV0 file: ./abis/IFilteredMinterSEAV0.json + - name: ERC20 + file: ./abis/ERC20.json eventHandlers: - event: MinimumAuctionLengthSecondsUpdated(uint256) handler: handleMinimumAuctionLengthSecondsUpdated @@ -1936,6 +1984,8 @@ dataSources: file: ./abis/IFilteredMinterMerkleV2.json - name: IFilteredMinterSEAV0 file: ./abis/IFilteredMinterSEAV0.json + - name: ERC20 + file: ./abis/ERC20.json eventHandlers: - event: PricePerTokenInWeiUpdated(indexed uint256,indexed uint256) handler: handlePricePerTokenInWeiUpdated @@ -1992,6 +2042,8 @@ dataSources: file: ./abis/IFilteredMinterMerkleV2.json - name: IFilteredMinterSEAV0 file: ./abis/IFilteredMinterSEAV0.json + - name: ERC20 + file: ./abis/ERC20.json eventHandlers: - event: PricePerTokenInWeiUpdated(indexed uint256,indexed uint256) handler: handlePricePerTokenInWeiUpdated @@ -2044,6 +2096,8 @@ dataSources: file: ./abis/IFilteredMinterMerkleV2.json - name: IFilteredMinterSEAV0 file: ./abis/IFilteredMinterSEAV0.json + - name: ERC20 + file: ./abis/ERC20.json eventHandlers: - event: PricePerTokenInWeiUpdated(indexed uint256,indexed uint256) handler: handlePricePerTokenInWeiUpdated @@ -2098,6 +2152,8 @@ dataSources: file: ./abis/IFilteredMinterMerkleV2.json - name: IFilteredMinterSEAV0 file: ./abis/IFilteredMinterSEAV0.json + - name: ERC20 + file: ./abis/ERC20.json eventHandlers: - event: PricePerTokenInWeiUpdated(indexed uint256,indexed uint256) handler: handlePricePerTokenInWeiUpdated @@ -2364,6 +2420,8 @@ templates: file: ./abis/IFilteredMinterDAExpV1.json - name: IFilteredMinterSEAV0 file: ./abis/IFilteredMinterSEAV0.json + - name: ERC20 + file: ./abis/ERC20.json eventHandlers: - event: Mint(indexed address,indexed uint256) handler: handleMint @@ -2425,6 +2483,8 @@ templates: file: ./abis/GenArt721CoreV3_Engine.json - name: IERC721 file: ./abis/IERC721.json + - name: ERC20 + file: ./abis/ERC20.json - name: Ownable file: ./abis/Ownable.json - name: IAdminACLV0 @@ -2492,6 +2552,8 @@ templates: file: ./abis/GenArt721CoreV3_Engine.json - name: IERC721 file: ./abis/IERC721.json + - name: ERC20 + file: ./abis/ERC20.json - name: Ownable file: ./abis/Ownable.json - name: IAdminACLV0 @@ -2559,6 +2621,8 @@ templates: file: ./abis/GenArt721CoreV3_Engine.json - name: IERC721 file: ./abis/IERC721.json + - name: ERC20 + file: ./abis/ERC20.json - name: Ownable file: ./abis/Ownable.json - name: IAdminACLV0 diff --git a/tests/e2e/runner/__tests__/graphql/get-project-minter-configurations.graphql b/tests/e2e/runner/__tests__/graphql/get-project-minter-configurations.graphql index c882d870..f6913aa2 100644 --- a/tests/e2e/runner/__tests__/graphql/get-project-minter-configurations.graphql +++ b/tests/e2e/runner/__tests__/graphql/get-project-minter-configurations.graphql @@ -9,6 +9,7 @@ fragment ProjectMinterConfigurationDetails on ProjectMinterConfiguration { priceIsConfigured currencySymbol currencyAddress + currencyDecimals purchaseToDisabled basePrice extraMinterDetails diff --git a/tests/e2e/runner/__tests__/graphql/get-projects.graphql b/tests/e2e/runner/__tests__/graphql/get-projects.graphql index c4b82811..f89cc5fa 100644 --- a/tests/e2e/runner/__tests__/graphql/get-projects.graphql +++ b/tests/e2e/runner/__tests__/graphql/get-projects.graphql @@ -19,6 +19,7 @@ fragment ProjectDetails on Project { priceIsConfigured currencySymbol currencyAddress + currencyDecimals purchaseToDisabled basePrice extraMinterDetails diff --git a/tests/e2e/runner/__tests__/minter-suite-v2/minter-filter-v2.test.ts b/tests/e2e/runner/__tests__/minter-suite-v2/minter-filter-v2.test.ts index 97c22644..63b0ce81 100644 --- a/tests/e2e/runner/__tests__/minter-suite-v2/minter-filter-v2.test.ts +++ b/tests/e2e/runner/__tests__/minter-suite-v2/minter-filter-v2.test.ts @@ -555,6 +555,7 @@ describe("MinterFilterV2 event handling", () => { expect(projectMinterConfig.priceIsConfigured).toBe(false); expect(projectMinterConfig.currencySymbol).toBe("ETH"); expect(projectMinterConfig.currencyAddress).toBe(constants.AddressZero); + expect(projectMinterConfig.currencyDecimals).toBe(18); expect(projectMinterConfig.purchaseToDisabled).toBe(false); expect(projectMinterConfig.extraMinterDetails).toBe("{}"); expect(projectMinterConfig.basePrice).toBeNull(); diff --git a/tests/e2e/runner/__tests__/minter-suite-v2/split-funds-lib.test.ts b/tests/e2e/runner/__tests__/minter-suite-v2/split-funds-lib.test.ts index 59ea6319..5fe2e90d 100644 --- a/tests/e2e/runner/__tests__/minter-suite-v2/split-funds-lib.test.ts +++ b/tests/e2e/runner/__tests__/minter-suite-v2/split-funds-lib.test.ts @@ -13,6 +13,7 @@ import { ERC20Mock__factory } from "../../contracts/factories/ERC20Mock__factory import { ethers } from "ethers"; // hide nuisance logs about event overloading import { Logger } from "@ethersproject/logger"; +import { ERC20MockAltDecimals__factory } from "../../contracts"; Logger.setLogLevel(Logger.levels.ERROR); // waiting for subgraph to sync can take longer than the default 5s timeout @@ -102,9 +103,9 @@ describe("SplitFundsLib event handling", () => { test("Currency is updated and configured", async () => { const currencySymbol = "ERC20"; // deploy new ERC20 currency, sending initial supply to artist - const newCurrency = await new ERC20Mock__factory(artist).deploy( - ethers.utils.parseEther("100") - ); + const newCurrency = await new ERC20MockAltDecimals__factory( + artist + ).deploy(ethers.utils.parseEther("100")); // set minter for project zero to the fixed price ERC20 minter await sharedMinterFilterContract .connect(artist) @@ -129,10 +130,14 @@ describe("SplitFundsLib event handling", () => { client, targetId ); + + const decimals = await newCurrency.decimals(); + expect(minterConfigRes.currencySymbol).toBe(currencySymbol); expect(minterConfigRes.currencyAddress).toBe( newCurrency.address.toLowerCase() ); + expect(minterConfigRes.currencyDecimals).toBe(decimals); }); }); }); diff --git a/tests/e2e/runner/supplemental_abis/ERC20MockAltDecimals.json b/tests/e2e/runner/supplemental_abis/ERC20MockAltDecimals.json new file mode 100644 index 00000000..0ae1e913 --- /dev/null +++ b/tests/e2e/runner/supplemental_abis/ERC20MockAltDecimals.json @@ -0,0 +1,318 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ERC20Mock", + "sourceName": "contracts/mock/ERC20MockAltDecimals.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "initialSupply", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "bannedReceiver", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "updateBannedAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60806040523480156200001157600080fd5b5060405162000d7738038062000d7783398101604081905262000034916200022d565b6040518060400160405280600a81526020016926b7b1b5902a37b5b2b760b11b815250604051806040016040528060048152602001634d4f434b60e01b8152508160039081620000859190620002ed565b506004620000948282620002ed565b505050620000a93382620000b060201b60201c565b50620003e1565b6001600160a01b0382166200010c5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b8060026000828254620001209190620003b9565b90915550506001600160a01b038216600090815260208190526040812080548392906200014f908490620003b9565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3620001a360008383620001ac565b5050565b505050565b6005546001600160a01b03908116908316036200021a5760405162461bcd60e51b815260206004820152602560248201527f45524332304d6f636b3a207472616e7366657220746f2062616e6e6564206164604482015264647265737360d81b606482015260840162000103565b620001a78383836001600160e01b038416565b6000602082840312156200024057600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200027257607f821691505b6020821081036200029357634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620001a7576000816000526020600020601f850160051c81016020861015620002c45750805b601f850160051c820191505b81811015620002e557828155600101620002d0565b505050505050565b81516001600160401b0381111562000309576200030962000247565b62000321816200031a84546200025d565b8462000299565b602080601f831160018114620003595760008415620003405750858301515b600019600386901b1c1916600185901b178555620002e5565b600085815260208120601f198616915b828110156200038a5788860151825594840194600190910190840162000369565b5085821015620003a95787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115620003db57634e487b7160e01b600052601160045260246000fd5b92915050565b61098680620003f16000396000f3fe608060405234801561001057600080fd5b50600436106100af5760003560e01c806306fdde03146100b4578063095ea7b3146100d257806318160ddd146100f557806323b872dd14610107578063313ce5671461011a57806339509351146101295780636f6d82e31461013c57806370a082311461016e57806395d89b4114610197578063a457c2d71461019f578063a9059cbb146101b2578063dd62ed3e146101c5578063fed6db29146101d8575b600080fd5b6100bc610203565b6040516100c991906107cf565b60405180910390f35b6100e56100e036600461083a565b610295565b60405190151581526020016100c9565b6002545b6040519081526020016100c9565b6100e5610115366004610864565b6102af565b604051600681526020016100c9565b6100e561013736600461083a565b6102d3565b61016c61014a3660046108a0565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b005b6100f961017c3660046108a0565b6001600160a01b031660009081526020819052604090205490565b6100bc610312565b6100e56101ad36600461083a565b610321565b6100e56101c036600461083a565b6103b8565b6100f96101d33660046108c2565b6103c6565b6005546101eb906001600160a01b031681565b6040516001600160a01b0390911681526020016100c9565b606060038054610212906108f5565b80601f016020809104026020016040519081016040528092919081815260200182805461023e906108f5565b801561028b5780601f106102605761010080835404028352916020019161028b565b820191906000526020600020905b81548152906001019060200180831161026e57829003601f168201915b5050505050905090565b6000336102a38185856103f1565b60019150505b92915050565b6000336102bd858285610515565b6102c885858561058f565b506001949350505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091906102a3908290869061030d90879061092f565b6103f1565b606060048054610212906108f5565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190838110156103ab5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b6102c882868684036103f1565b6000336102a381858561058f565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166104535760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016103a2565b6001600160a01b0382166104b45760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016103a2565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600061052184846103c6565b90506000198114610589578181101561057c5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016103a2565b61058984848484036103f1565b50505050565b6001600160a01b0383166105f35760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016103a2565b6001600160a01b0382166106555760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016103a2565b6001600160a01b038316600090815260208190526040902054818110156106cd5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016103a2565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061070490849061092f565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161075091815260200190565b60405180910390a36105898484846005546001600160a01b03908116908316036107ca5760405162461bcd60e51b815260206004820152602560248201527f45524332304d6f636b3a207472616e7366657220746f2062616e6e6564206164604482015264647265737360d81b60648201526084016103a2565b505050565b60006020808352835180602085015260005b818110156107fd578581018301518582016040015282016107e1565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461083557600080fd5b919050565b6000806040838503121561084d57600080fd5b6108568361081e565b946020939093013593505050565b60008060006060848603121561087957600080fd5b6108828461081e565b92506108906020850161081e565b9150604084013590509250925092565b6000602082840312156108b257600080fd5b6108bb8261081e565b9392505050565b600080604083850312156108d557600080fd5b6108de8361081e565b91506108ec6020840161081e565b90509250929050565b600181811c9082168061090957607f821691505b60208210810361092957634e487b7160e01b600052602260045260246000fd5b50919050565b808201808211156102a957634e487b7160e01b600052601160045260246000fdfea26469706673582212209f848d50376202e766606f8c77aafab759f91b25b84ead7a15ac215af19e252c64736f6c63430008160033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100af5760003560e01c806306fdde03146100b4578063095ea7b3146100d257806318160ddd146100f557806323b872dd14610107578063313ce5671461011a57806339509351146101295780636f6d82e31461013c57806370a082311461016e57806395d89b4114610197578063a457c2d71461019f578063a9059cbb146101b2578063dd62ed3e146101c5578063fed6db29146101d8575b600080fd5b6100bc610203565b6040516100c991906107cf565b60405180910390f35b6100e56100e036600461083a565b610295565b60405190151581526020016100c9565b6002545b6040519081526020016100c9565b6100e5610115366004610864565b6102af565b604051600681526020016100c9565b6100e561013736600461083a565b6102d3565b61016c61014a3660046108a0565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b005b6100f961017c3660046108a0565b6001600160a01b031660009081526020819052604090205490565b6100bc610312565b6100e56101ad36600461083a565b610321565b6100e56101c036600461083a565b6103b8565b6100f96101d33660046108c2565b6103c6565b6005546101eb906001600160a01b031681565b6040516001600160a01b0390911681526020016100c9565b606060038054610212906108f5565b80601f016020809104026020016040519081016040528092919081815260200182805461023e906108f5565b801561028b5780601f106102605761010080835404028352916020019161028b565b820191906000526020600020905b81548152906001019060200180831161026e57829003601f168201915b5050505050905090565b6000336102a38185856103f1565b60019150505b92915050565b6000336102bd858285610515565b6102c885858561058f565b506001949350505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091906102a3908290869061030d90879061092f565b6103f1565b606060048054610212906108f5565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190838110156103ab5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b6102c882868684036103f1565b6000336102a381858561058f565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b0383166104535760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016103a2565b6001600160a01b0382166104b45760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016103a2565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600061052184846103c6565b90506000198114610589578181101561057c5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016103a2565b61058984848484036103f1565b50505050565b6001600160a01b0383166105f35760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016103a2565b6001600160a01b0382166106555760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016103a2565b6001600160a01b038316600090815260208190526040902054818110156106cd5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016103a2565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061070490849061092f565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161075091815260200190565b60405180910390a36105898484846005546001600160a01b03908116908316036107ca5760405162461bcd60e51b815260206004820152602560248201527f45524332304d6f636b3a207472616e7366657220746f2062616e6e6564206164604482015264647265737360d81b60648201526084016103a2565b505050565b60006020808352835180602085015260005b818110156107fd578581018301518582016040015282016107e1565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461083557600080fd5b919050565b6000806040838503121561084d57600080fd5b6108568361081e565b946020939093013593505050565b60008060006060848603121561087957600080fd5b6108828461081e565b92506108906020850161081e565b9150604084013590509250925092565b6000602082840312156108b257600080fd5b6108bb8261081e565b9392505050565b600080604083850312156108d557600080fd5b6108de8361081e565b91506108ec6020840161081e565b90509250929050565b600181811c9082168061090957607f821691505b60208210810361092957634e487b7160e01b600052602260045260246000fd5b50919050565b808201808211156102a957634e487b7160e01b600052601160045260246000fdfea26469706673582212209f848d50376202e766606f8c77aafab759f91b25b84ead7a15ac215af19e252c64736f6c63430008160033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/tests/e2e/runner/yarn.lock b/tests/e2e/runner/yarn.lock index 16e321aa..fe9ba6e5 100644 --- a/tests/e2e/runner/yarn.lock +++ b/tests/e2e/runner/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@0no-co/graphql.web@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@0no-co/graphql.web/-/graphql.web-1.0.1.tgz#db3da0d2cd41548b50f0583c0d2f4743c767e56b" - integrity sha512-6Yaxyv6rOwRkLIvFaL0NrLDgfNqC/Ng9QOPmTmlqW4mORXMEKmh5NYGkIvvt5Yw8fZesnMAqkj8cIqTj8f40cQ== +"@0no-co/graphql.web@^1.0.5": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@0no-co/graphql.web/-/graphql.web-1.0.7.tgz#c7a762c887b3482a79ffa68f63de5e96059a62e4" + integrity sha512-E3Qku4mTzdrlwVWGPxklDnME5ANrEGetvYw4i2GCRlppWXXE4QD66j7pwb8HelZwS6LnqEChhrSOGCXpbiu6MQ== "@ampproject/remapping@^2.1.0": version "2.2.0" @@ -45,18 +45,21 @@ dependencies: node-fetch "^2.6.1" -"@artblocks/contracts@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@artblocks/contracts/-/contracts-1.1.0.tgz#3dc17759a672c99bc3d0006d4352bdea92325ea0" - integrity sha512-pes9VoiC0pzDoRQbwbVoYKwrQ6kFZUJTt5PUu1j90DNASWvKaNAQSQAUzsKFrDmhpRX0hllbXzlfBDy0tE0D1A== +"@artblocks/contracts@1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@artblocks/contracts/-/contracts-1.2.0.tgz#aa28a894da72a2238268f5d56e385ef8691dab5f" + integrity sha512-kHB8oNng6B+Ns/AleVoEHAqB15/vGxZVA5eDQPV+cl8TKwmVH4Pynky5ctB9CTbbWMm+GC0ZL8FILXRAYG3Bkw== dependencies: + "@nomicfoundation/hardhat-verify" "^2.0.5" "@openzeppelin-0.5/contracts" "npm:@openzeppelin/contracts@2.5.1" "@openzeppelin-4.5/contracts" "npm:@openzeppelin/contracts@4.5.0" "@openzeppelin-4.7/contracts" "npm:@openzeppelin/contracts@4.7.1" "@openzeppelin-4.8/contracts-upgradeable" "npm:@openzeppelin/contracts-upgradeable@4.8.0" - "@urql/exchange-retry" "^1.2.0" + "@openzeppelin-5.0/contracts" "npm:@openzeppelin/contracts@5.0.1" + "@urql/exchange-retry" "^1.2.1" graphql "^16.8.1" - urql "^4.0.5" + solady "^0.0.181" + urql "^4.0.7" "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": version "7.18.6" @@ -687,7 +690,7 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.7.0": +"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== @@ -726,7 +729,7 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/properties" "^5.7.0" -"@ethersproject/address@5.7.0", "@ethersproject/address@^5.7.0": +"@ethersproject/address@5.7.0", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== @@ -1029,6 +1032,11 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" +"@fastify/busboy@^2.0.0": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" + integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA== + "@graphql-codegen/cli@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@graphql-codegen/cli/-/cli-3.0.0.tgz#eb367adfe51349e4822518183fc7ea7c06aea11b" @@ -1767,6 +1775,21 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@nomicfoundation/hardhat-verify@^2.0.5": + version "2.0.9" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.9.tgz#98a1c9a3742b008be71a709d074f10dec23bc5f0" + integrity sha512-7kD8hu1+zlnX87gC+UN4S0HTKBnIsDfXZ/pproq1gYsK94hgCk+exvzXbwR0X2giiY/RZPkqY9oKRi0Uev91hQ== + dependencies: + "@ethersproject/abi" "^5.1.2" + "@ethersproject/address" "^5.0.2" + cbor "^8.1.0" + chalk "^2.4.2" + debug "^4.1.1" + lodash.clonedeep "^4.5.0" + semver "^6.3.0" + table "^6.8.0" + undici "^5.14.0" + "@openzeppelin-0.5/contracts@npm:@openzeppelin/contracts@2.5.1": version "2.5.1" resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-2.5.1.tgz#c76e3fc57aa224da3718ec351812a4251289db31" @@ -1787,6 +1810,11 @@ resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.8.0.tgz#26688982f46969018e3ed3199e72a07c8d114275" integrity sha512-5GeFgqMiDlqGT8EdORadp1ntGF0qzWZLmEY7Wbp/yVhN7/B3NNzCxujuI77ktlyG81N3CUZP8cZe3ZAQ/cW10w== +"@openzeppelin-5.0/contracts@npm:@openzeppelin/contracts@5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-5.0.1.tgz#93da90fc209a0a4ff09c1deb037fbb35e4020890" + integrity sha512-yQJaT5HDp9hYOOp4jTYxMsR02gdFZFXhewX5HW9Jo4fsqSVqqyIO/xTHdWDaKX5a3pv1txmf076Lziz+sO7L1w== + "@peculiar/asn1-schema@^2.1.6", "@peculiar/asn1-schema@^2.3.0": version "2.3.3" resolved "https://registry.yarnpkg.com/@peculiar/asn1-schema/-/asn1-schema-2.3.3.tgz#21418e1f3819e0b353ceff0c2dad8ccb61acd777" @@ -2011,12 +2039,12 @@ dependencies: wonka "^6.1.2" -"@urql/core@>=4.0.0", "@urql/core@^4.1.0": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@urql/core/-/core-4.1.1.tgz#b1312eb0ecbc91e315457a3ec14741321cbee1c7" - integrity sha512-iIoAy6BY+BUZZ7KIpnMT7C9q+ULf5ZCVxGe3/i7WZSJBrQa2h1QkIMhL+8fAKmOn9gt83jSIv5drWWnhZ9izEA== +"@urql/core@^5.0.0": + version "5.0.6" + resolved "https://registry.yarnpkg.com/@urql/core/-/core-5.0.6.tgz#0d6624e30084f9137f78dc6c5bb8a599cba7f9dc" + integrity sha512-38rgSDqVNihFDauw1Pm9V7XLWIKuK8V9CKgrUF7/xEKinze8ENKP1ZeBhkG+dxWzJan7CHK+SLl46kAdvZwIlA== dependencies: - "@0no-co/graphql.web" "^1.0.1" + "@0no-co/graphql.web" "^1.0.5" wonka "^6.3.2" "@urql/exchange-retry@^1.0.0": @@ -2027,12 +2055,12 @@ "@urql/core" ">=3.0.0" wonka "^6.0.0" -"@urql/exchange-retry@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@urql/exchange-retry/-/exchange-retry-1.2.0.tgz#23d3ec711754e3c67a843e0106f2cabddff2e5ff" - integrity sha512-1O/biKiVhhn0EtvDF4UOvz325K4RrLupfL8rHcmqD2TBLv4qVDWQuzx4JGa1FfqjjRb+C9TNZ6w19f32Mq85Ug== +"@urql/exchange-retry@^1.2.1": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@urql/exchange-retry/-/exchange-retry-1.3.0.tgz#c46abdf74aee612645ff47562e6c6868ad1731dd" + integrity sha512-FLt+d81gP4oiHah4hWFDApimc+/xABWMU1AMYsZ1PVB0L0YPtrMCjbOp9WMM7hBzy4gbTDrG24sio0dCfSh/HQ== dependencies: - "@urql/core" ">=4.0.0" + "@urql/core" "^5.0.0" wonka "^6.3.2" "@whatwg-node/events@^0.0.2": @@ -2110,6 +2138,16 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" +ajv@^8.0.1: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== + dependencies: + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" @@ -2468,6 +2506,13 @@ capital-case@^1.0.4: tslib "^2.0.3" upper-case-first "^2.0.2" +cbor@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/cbor/-/cbor-8.1.0.tgz#cfc56437e770b73417a2ecbfc9caf6b771af60d5" + integrity sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg== + dependencies: + nofilter "^3.1.0" + chalk@^2.0.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -3025,6 +3070,11 @@ extract-files@^9.0.0: resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-9.0.0.tgz#8a7744f2437f81f5ed3250ed9f1550de902fe54a" integrity sha512-CvdFfHkC95B4bBBk36hcEmvdR2awOdhhVUYH6S/zrVj3477zven/fJMYg7121h4T1xHZC+tetUpubpAhxwI7hQ== +fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + fast-glob@^3.2.9: version "3.2.12" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" @@ -3041,6 +3091,11 @@ fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.1.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== +fast-uri@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.1.tgz#cddd2eecfc83a71c1be2cc2ef2061331be8a7134" + integrity sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw== + fastq@^1.6.0: version "1.15.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" @@ -3998,6 +4053,11 @@ json-parse-even-better-errors@^2.3.0: resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + json-stable-stringify@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz#e06f23128e0bbe342dc996ed5a19e28b57b580e0" @@ -4110,11 +4170,21 @@ lodash.camelcase@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== + lodash.memoize@4.x: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== + lodash@^4.17.15, lodash@^4.17.16, lodash@^4.17.20, lodash@^4.17.21, lodash@~4.17.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" @@ -4360,6 +4430,11 @@ node-releases@^2.0.8: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== +nofilter@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-3.1.0.tgz#c757ba68801d41ff930ba2ec55bab52ca184aa66" + integrity sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g== + normalize-package-data@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" @@ -4733,6 +4808,11 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + require-main-filename@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" @@ -4920,6 +5000,11 @@ snake-case@^3.0.4: dot-case "^3.0.4" tslib "^2.0.3" +solady@^0.0.181: + version "0.0.181" + resolved "https://registry.yarnpkg.com/solady/-/solady-0.0.181.tgz#500b5c26010e1dec89b1fc71cb1ad33c7a761a82" + integrity sha512-uxMny+zHi9xrsKaoZoLliBkKBz00i7bWLHt2YMYjgsh7zKcQHWcONzY0zQB7qaGDzvxf4m/jFv8XiWpcP+0Pig== + source-map-support@0.5.13: version "0.5.13" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" @@ -5089,6 +5174,17 @@ table-layout@^1.0.2: typical "^5.2.0" wordwrapjs "^4.0.0" +table@^6.8.0: + version "6.8.2" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.2.tgz#c5504ccf201213fa227248bdc8c5569716ac6c58" + integrity sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA== + dependencies: + ajv "^8.0.1" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" @@ -5264,6 +5360,13 @@ unc-path-regex@^0.1.2: resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" integrity sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg== +undici@^5.14.0: + version "5.28.4" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.4.tgz#6b280408edb6a1a604a9b20340f45b422e373068" + integrity sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g== + dependencies: + "@fastify/busboy" "^2.0.0" + universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -5313,12 +5416,12 @@ urql@^3.0.3: "@urql/core" "^3.0.3" wonka "^6.0.0" -urql@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/urql/-/urql-4.0.5.tgz#354106523a523d9b0c4101bf4988c7e34c5a243c" - integrity sha512-VicPBQXWicSbE+0oPzU2HMyDa//76FmwyQ7LayaYQxX97nhvMLs2ZWQdUmEzQQqvmw4YFaI0wPz1Qisp+PrZIQ== +urql@^4.0.7: + version "4.1.0" + resolved "https://registry.yarnpkg.com/urql/-/urql-4.1.0.tgz#a75efe572d7b2e69103649a8457d3a63fce31ee8" + integrity sha512-NfbfTvxy1sM89EQAJWm89qJZihUWk7BSMfrWgfljFXLOf+e7RK7DtV/Tbg2+82HnCG2x3LcEOJenxiFSYEC+bw== dependencies: - "@urql/core" "^4.1.0" + "@urql/core" "^5.0.0" wonka "^6.3.2" util-deprecate@^1.0.1: diff --git a/tests/subgraph/legacy-minter-suite/minter-filter-mapping.test.ts b/tests/subgraph/legacy-minter-suite/minter-filter-mapping.test.ts index bd1e7fc7..a21e9e5e 100644 --- a/tests/subgraph/legacy-minter-suite/minter-filter-mapping.test.ts +++ b/tests/subgraph/legacy-minter-suite/minter-filter-mapping.test.ts @@ -355,6 +355,7 @@ test("handleIsCanonicalMinterFilter should populate project minter configuration const project0BasePrice = BigInt.fromI32(0); const project0CurrencySymbol = "ETH"; const project0CurrencyAddress = Address.zero(); + const project0CurrencyDecimals = 18; const project0PurchaseToDisabled = true; const project0MinterType = "MinterSetPriceV0"; @@ -367,6 +368,7 @@ test("handleIsCanonicalMinterFilter should populate project minter configuration previousMinterConfig0.priceIsConfigured = project0PriceIsConfigured; previousMinterConfig0.currencyAddress = project0CurrencyAddress; previousMinterConfig0.currencySymbol = project0CurrencySymbol; + previousMinterConfig0.currencyDecimals = project0CurrencyDecimals; previousMinterConfig0.purchaseToDisabled = project0PurchaseToDisabled; previousMinterConfig0.extraMinterDetails = "{}"; @@ -389,6 +391,7 @@ test("handleIsCanonicalMinterFilter should populate project minter configuration const project1BasePrice = BigInt.fromI64(i64(1e18)); const project1CurrencySymbol = "DAI"; const project1CurrencyAddress = randomAddressGenerator.generateRandomAddress(); + const project1CurrencyDecimals = 18; const project1PurchaseToDisabled = false; const project1MinterType = "MinterSetPriceERC20V0"; @@ -404,6 +407,7 @@ test("handleIsCanonicalMinterFilter should populate project minter configuration previousMinterConfig1.priceIsConfigured = project1PriceIsConfigured; previousMinterConfig1.currencyAddress = project1CurrencyAddress; previousMinterConfig1.currencySymbol = project1CurrencySymbol; + previousMinterConfig1.currencyDecimals = project1CurrencyDecimals; previousMinterConfig1.purchaseToDisabled = project1PurchaseToDisabled; previousMinterConfig1.extraMinterDetails = "{}"; @@ -425,6 +429,7 @@ test("handleIsCanonicalMinterFilter should populate project minter configuration const project2PriceIsConfigured = true; const project2CurrencySymbol = "ETH"; const project2CurrencyAddress = Address.zero(); + const project2CurrencyDecimals = 18; const project2PurchaseToDisabled = false; const project2StartTime = CURRENT_BLOCK_TIMESTAMP.plus(BigInt.fromI32(100)); const project2EndTime = CURRENT_BLOCK_TIMESTAMP.plus(BigInt.fromI32(3700)); @@ -441,6 +446,7 @@ test("handleIsCanonicalMinterFilter should populate project minter configuration previousMinterConfig2.priceIsConfigured = project2PriceIsConfigured; previousMinterConfig2.currencyAddress = project2CurrencyAddress; previousMinterConfig2.currencySymbol = project2CurrencySymbol; + previousMinterConfig2.currencyDecimals = project2CurrencyDecimals; previousMinterConfig2.purchaseToDisabled = project2PurchaseToDisabled; previousMinterConfig2.extraMinterDetails = getJSONStringFromEntries([ { key: "startTime", value: toJSONValue(project2StartTime) }, @@ -470,6 +476,7 @@ test("handleIsCanonicalMinterFilter should populate project minter configuration const project3PriceIsConfigured = true; const project3CurrencySymbol = "ETH"; const project3CurrencyAddress = Address.zero(); + const project3CurrencyDecimals = 18; const project3PurchaseToDisabled = false; const project3StartTime = CURRENT_BLOCK_TIMESTAMP.plus(BigInt.fromI32(100)); const project3HalfLifeSeconds = BigInt.fromI32(500); @@ -487,6 +494,7 @@ test("handleIsCanonicalMinterFilter should populate project minter configuration previousMinterConfig3.currencyAddress = project3CurrencyAddress; previousMinterConfig3.currencySymbol = project3CurrencySymbol; previousMinterConfig3.purchaseToDisabled = project3PurchaseToDisabled; + previousMinterConfig3.currencyDecimals = project3CurrencyDecimals; previousMinterConfig3.extraMinterDetails = getJSONStringFromEntries([ { key: "halfLifeSeconds", value: toJSONValue(project3HalfLifeSeconds) }, { key: "startTime", value: toJSONValue(project3StartTime) }, @@ -1603,6 +1611,7 @@ test("handleProjectMinterRegistered should populate project from prior minter co const projectBasePrice = ONE_ETH_IN_WEI.div(BigInt.fromI32(10)); const projectCurrencySymbol = "ETH"; const projectCurrencyAddress = Address.zero(); + const projectCurrencyDecimals = 18; const projectPurchaseToDisabled = false; const project = addNewProjectToStore( TEST_CONTRACT_ADDRESS, @@ -1644,6 +1653,7 @@ test("handleProjectMinterRegistered should populate project from prior minter co previousMinterConfig.priceIsConfigured = projectPriceIsConfigured; previousMinterConfig.currencyAddress = projectCurrencyAddress; previousMinterConfig.currencySymbol = projectCurrencySymbol; + previousMinterConfig.currencyDecimals = projectCurrencyDecimals; previousMinterConfig.purchaseToDisabled = projectPurchaseToDisabled; previousMinterConfig.extraMinterDetails = "{}"; diff --git a/tests/subgraph/legacy-minter-suite/minter-suite-mapping.test.ts b/tests/subgraph/legacy-minter-suite/minter-suite-mapping.test.ts index f6e6d870..6114252b 100644 --- a/tests/subgraph/legacy-minter-suite/minter-suite-mapping.test.ts +++ b/tests/subgraph/legacy-minter-suite/minter-suite-mapping.test.ts @@ -23,7 +23,8 @@ import { TEST_CONTRACT_ADDRESS, assertJsonFieldEquals, getJSONStringFromEntries, - addTestMinterFilterToStore + addTestMinterFilterToStore, + mockCurrencyDecimals } from "../shared-helpers"; import { generateContractSpecificId, @@ -217,6 +218,7 @@ describe("handlePricePerTokenInWeiUpdated", () => { projectMinterConfig.purchaseToDisabled = false; projectMinterConfig.currencyAddress = Address.zero(); projectMinterConfig.currencySymbol = "ETH"; + projectMinterConfig.currencyDecimals = 18; projectMinterConfig.save(); const newPricePerTokenInWei = ONE_ETH_IN_WEI.div(BigInt.fromI32(5)); @@ -324,11 +326,13 @@ describe("handleProjectCurrencyInfoUpdated", () => { projectMinterConfig.priceIsConfigured = false; projectMinterConfig.currencyAddress = Address.zero(); projectMinterConfig.currencySymbol = "ETH"; + projectMinterConfig.currencyDecimals = 18; projectMinterConfig.purchaseToDisabled = false; projectMinterConfig.save(); const newCurrencyAddress = randomAddressGenerator.generateRandomAddress(); const newCurrencySymbol = "DAI"; + const newCurrencyDecimals = 6; const projectCurrencyInfoUpdatedEvent: ProjectCurrencyInfoUpdated = changetype< ProjectCurrencyInfoUpdated >(newMockEvent()); @@ -353,6 +357,8 @@ describe("handleProjectCurrencyInfoUpdated", () => { newCurrencyAddress != projectMinterConfig.currencyAddress ); + mockCurrencyDecimals(newCurrencyAddress, newCurrencyDecimals); + handleProjectCurrencyInfoUpdated(projectCurrencyInfoUpdatedEvent); assert.fieldEquals( @@ -367,6 +373,12 @@ describe("handleProjectCurrencyInfoUpdated", () => { "currencySymbol", newCurrencySymbol ); + assert.fieldEquals( + PROJECT_MINTER_CONFIGURATION_ENTITY_TYPE, + getProjectMinterConfigId(minterAddress.toHexString(), project.id), + "currencyDecimals", + newCurrencyDecimals.toString() + ); assert.fieldEquals( PROJECT_ENTITY_TYPE, @@ -447,6 +459,7 @@ describe("handlePurchaseToDisabledUpdated", () => { projectMinterConfig.priceIsConfigured = false; projectMinterConfig.currencyAddress = Address.zero(); projectMinterConfig.currencySymbol = "ETH"; + projectMinterConfig.currencyDecimals = 18; projectMinterConfig.purchaseToDisabled = false; projectMinterConfig.save(); @@ -610,6 +623,7 @@ describe("MinterDALin-related tests", () => { projectMinterConfig.priceIsConfigured = false; projectMinterConfig.currencyAddress = Address.zero(); projectMinterConfig.currencySymbol = "ETH"; + projectMinterConfig.currencyDecimals = 18; projectMinterConfig.purchaseToDisabled = false; projectMinterConfig.save(); @@ -766,6 +780,7 @@ describe("MinterDALin-related tests", () => { projectMinterConfig.priceIsConfigured = true; projectMinterConfig.currencyAddress = Address.zero(); projectMinterConfig.currencySymbol = "ETH"; + projectMinterConfig.currencyDecimals = 18; projectMinterConfig.purchaseToDisabled = false; projectMinterConfig.save(); @@ -957,6 +972,7 @@ describe("MinterDAExp-related tests", () => { projectMinterConfig.priceIsConfigured = false; projectMinterConfig.currencyAddress = Address.zero(); projectMinterConfig.currencySymbol = "ETH"; + projectMinterConfig.currencyDecimals = 18; projectMinterConfig.purchaseToDisabled = false; projectMinterConfig.save(); @@ -1075,6 +1091,7 @@ describe("MinterDAExp-related tests", () => { projectMinterConfig.priceIsConfigured = false; projectMinterConfig.currencyAddress = Address.zero(); projectMinterConfig.currencySymbol = "ETH"; + projectMinterConfig.currencyDecimals = 18; projectMinterConfig.purchaseToDisabled = false; projectMinterConfig.save(); @@ -1262,6 +1279,7 @@ describe("MinterDAExp-related tests", () => { projectMinterConfig.priceIsConfigured = true; projectMinterConfig.currencyAddress = Address.zero(); projectMinterConfig.currencySymbol = "ETH"; + projectMinterConfig.currencyDecimals = 18; projectMinterConfig.purchaseToDisabled = false; projectMinterConfig.save(); @@ -1373,6 +1391,7 @@ describe("MinterDAExp-related tests", () => { projectMinterConfig.priceIsConfigured = true; projectMinterConfig.currencyAddress = Address.zero(); projectMinterConfig.currencySymbol = "ETH"; + projectMinterConfig.currencyDecimals = 18; projectMinterConfig.purchaseToDisabled = false; projectMinterConfig.save(); @@ -1486,6 +1505,7 @@ describe("DAExpSettlementMinters", () => { projectMinterConfig.priceIsConfigured = true; projectMinterConfig.currencyAddress = Address.zero(); projectMinterConfig.currencySymbol = "ETH"; + projectMinterConfig.currencyDecimals = 18; projectMinterConfig.purchaseToDisabled = false; projectMinterConfig.save(); @@ -1638,6 +1658,7 @@ describe("DAExpSettlementMinters", () => { projectMinterConfig.priceIsConfigured = true; projectMinterConfig.currencyAddress = Address.zero(); projectMinterConfig.currencySymbol = "ETH"; + projectMinterConfig.currencyDecimals = 18; projectMinterConfig.purchaseToDisabled = false; projectMinterConfig.save(); @@ -1836,6 +1857,7 @@ describe("DAExpSettlementMinters", () => { projectMinterConfig.priceIsConfigured = true; projectMinterConfig.currencyAddress = Address.zero(); projectMinterConfig.currencySymbol = "ETH"; + projectMinterConfig.currencyDecimals = 18; projectMinterConfig.purchaseToDisabled = false; projectMinterConfig.save(); @@ -1921,6 +1943,7 @@ describe("DAExpSettlementMinters", () => { projectMinterConfig.priceIsConfigured = true; projectMinterConfig.currencyAddress = Address.zero(); projectMinterConfig.currencySymbol = "ETH"; + projectMinterConfig.currencyDecimals = 18; projectMinterConfig.purchaseToDisabled = false; projectMinterConfig.save(); @@ -2043,6 +2066,7 @@ describe("DAExpSettlementMinters", () => { projectMinterConfig.priceIsConfigured = true; projectMinterConfig.currencyAddress = Address.zero(); projectMinterConfig.currencySymbol = "ETH"; + projectMinterConfig.currencyDecimals = 18; projectMinterConfig.purchaseToDisabled = false; projectMinterConfig.save(); @@ -4153,6 +4177,7 @@ describe("handleProjectMaxInvocationsLimitUpdated", () => { projectMinterConfig.priceIsConfigured = false; projectMinterConfig.currencyAddress = Address.zero(); projectMinterConfig.currencySymbol = "ETH"; + projectMinterConfig.currencyDecimals = 18; projectMinterConfig.purchaseToDisabled = false; projectMinterConfig.save(); diff --git a/tests/subgraph/mapping-v1-core/mapping.test.ts b/tests/subgraph/mapping-v1-core/mapping.test.ts index ba11fc8d..cf95a12c 100644 --- a/tests/subgraph/mapping-v1-core/mapping.test.ts +++ b/tests/subgraph/mapping-v1-core/mapping.test.ts @@ -31,7 +31,8 @@ import { addNewTokenToStore, TRANSFER_ENTITY_TYPE, addNewLegacyProjectMinterConfigToStore, - PRIMARY_PURCHASE_ENTITY_TYPE + PRIMARY_PURCHASE_ENTITY_TYPE, + mockCurrencyDecimals } from "../shared-helpers"; import { @@ -1600,6 +1601,9 @@ test("GenArt721Core: Can update a projects currency info", () => { ); const currencySymbol = "DAI"; const currencyAddress = randomAddressGenerator.generateRandomAddress(); + const currencyDecimals = 6; + + mockCurrencyDecimals(currencyAddress, currencyDecimals); const call = changetype(newMockCall()); call.to = TEST_CONTRACT_ADDRESS; @@ -1631,6 +1635,12 @@ test("GenArt721Core: Can update a projects currency info", () => { "currencyAddress", DEFAULT_PROJECT_VALUES.currencyAddress.toHexString() ); + assert.fieldEquals( + PROJECT_ENTITY_TYPE, + fullProjectId, + "currencyDecimals", + DEFAULT_PROJECT_VALUES.currencyDecimals.toString() + ); handleUpdateProjectCurrencyInfo(call); @@ -1646,6 +1656,12 @@ test("GenArt721Core: Can update a projects currency info", () => { "currencyAddress", currencyAddress.toHexString() ); + assert.fieldEquals( + PROJECT_ENTITY_TYPE, + fullProjectId, + "currencyDecimals", + currencyDecimals.toString() + ); assert.fieldEquals( PROJECT_ENTITY_TYPE, fullProjectId, diff --git a/tests/subgraph/mapping-v2-core/pbab-mapping.test.ts b/tests/subgraph/mapping-v2-core/pbab-mapping.test.ts index 58e2f0e7..f79e664c 100644 --- a/tests/subgraph/mapping-v2-core/pbab-mapping.test.ts +++ b/tests/subgraph/mapping-v2-core/pbab-mapping.test.ts @@ -32,7 +32,8 @@ import { mockTokenIdToHash, TEST_TOKEN_HASH, addNewLegacyProjectMinterConfigToStore, - PRIMARY_PURCHASE_ENTITY_TYPE + PRIMARY_PURCHASE_ENTITY_TYPE, + mockCurrencyDecimals } from "../shared-helpers"; import { @@ -1164,6 +1165,9 @@ test("GenArt721Core2PBAB: Can update a projects currency info", () => { ); const currencySymbol = "DAI"; const currencyAddress = randomAddressGenerator.generateRandomAddress(); + const currencyDecimals = 6; + + mockCurrencyDecimals(currencyAddress, currencyDecimals); const call = changetype(newMockCall()); call.to = TEST_CONTRACT_ADDRESS; diff --git a/tests/subgraph/mapping-v3-core/mapping-v3-core-minter-updated.test.ts b/tests/subgraph/mapping-v3-core/mapping-v3-core-minter-updated.test.ts index de120011..69a1d46c 100644 --- a/tests/subgraph/mapping-v3-core/mapping-v3-core-minter-updated.test.ts +++ b/tests/subgraph/mapping-v3-core/mapping-v3-core-minter-updated.test.ts @@ -289,6 +289,7 @@ test(`${coreType}/MinterUpdated: should populate project minter configurations f const project0BasePrice = BigInt.fromI32(0); const project0CurrencySymbol = "ETH"; const project0CurrencyAddress = Address.zero(); + const project0CurrencyDecimals = 18; const project0PurchaseToDisabled = true; const project0MinterType = "MinterSetPriceV2"; @@ -301,6 +302,7 @@ test(`${coreType}/MinterUpdated: should populate project minter configurations f previousMinterConfig0.priceIsConfigured = project0PriceIsConfigured; previousMinterConfig0.currencyAddress = project0CurrencyAddress; previousMinterConfig0.currencySymbol = project0CurrencySymbol; + previousMinterConfig0.currencyDecimals = project0CurrencyDecimals; previousMinterConfig0.purchaseToDisabled = project0PurchaseToDisabled; previousMinterConfig0.extraMinterDetails = "{}"; @@ -323,6 +325,7 @@ test(`${coreType}/MinterUpdated: should populate project minter configurations f const project1BasePrice = BigInt.fromI64(i64(1e18)); const project1CurrencySymbol = "DAI"; const project1CurrencyAddress = randomAddressGenerator.generateRandomAddress(); + const project1CurrencyDecimals = 18; const project1PurchaseToDisabled = false; const project1MinterType = "MinterSetPriceERC20V2"; @@ -338,6 +341,7 @@ test(`${coreType}/MinterUpdated: should populate project minter configurations f previousMinterConfig1.priceIsConfigured = project1PriceIsConfigured; previousMinterConfig1.currencyAddress = project1CurrencyAddress; previousMinterConfig1.currencySymbol = project1CurrencySymbol; + previousMinterConfig1.currencyDecimals = project1CurrencyDecimals; previousMinterConfig1.purchaseToDisabled = project1PurchaseToDisabled; previousMinterConfig1.extraMinterDetails = "{}"; @@ -362,6 +366,7 @@ test(`${coreType}/MinterUpdated: should populate project minter configurations f const project2PriceIsConfigured = true; const project2CurrencySymbol = "ETH"; const project2CurrencyAddress = Address.zero(); + const project2CurrencyDecimals = 18; const project2PurchaseToDisabled = false; const project2StartTime = CURRENT_BLOCK_TIMESTAMP.plus(BigInt.fromI32(100)); const project2EndTime = CURRENT_BLOCK_TIMESTAMP.plus(BigInt.fromI32(3700)); @@ -378,6 +383,7 @@ test(`${coreType}/MinterUpdated: should populate project minter configurations f previousMinterConfig2.priceIsConfigured = project2PriceIsConfigured; previousMinterConfig2.currencyAddress = project2CurrencyAddress; previousMinterConfig2.currencySymbol = project2CurrencySymbol; + previousMinterConfig2.currencyDecimals = project2CurrencyDecimals; previousMinterConfig2.purchaseToDisabled = project2PurchaseToDisabled; previousMinterConfig2.extraMinterDetails = getJSONStringFromEntries([ { key: "startTime", value: toJSONValue(project2StartTime) }, @@ -407,6 +413,7 @@ test(`${coreType}/MinterUpdated: should populate project minter configurations f const project3PriceIsConfigured = true; const project3CurrencySymbol = "ETH"; const project3CurrencyAddress = Address.zero(); + const project3CurrencyDecimals = 18; const project3PurchaseToDisabled = false; const project3StartTime = CURRENT_BLOCK_TIMESTAMP.plus(BigInt.fromI32(100)); const project3HalfLifeSeconds = BigInt.fromI32(500); @@ -422,6 +429,7 @@ test(`${coreType}/MinterUpdated: should populate project minter configurations f previousMinterConfig3.basePrice = project3BasePrice; previousMinterConfig3.priceIsConfigured = project3PriceIsConfigured; previousMinterConfig3.currencyAddress = project3CurrencyAddress; + previousMinterConfig3.currencyDecimals = project3CurrencyDecimals; previousMinterConfig3.currencySymbol = project3CurrencySymbol; previousMinterConfig3.purchaseToDisabled = project3PurchaseToDisabled; previousMinterConfig3.extraMinterDetails = getJSONStringFromEntries([ diff --git a/tests/subgraph/mapping-v3-core/mapping-v3-core.test.ts b/tests/subgraph/mapping-v3-core/mapping-v3-core.test.ts index df91652f..15e4c54a 100644 --- a/tests/subgraph/mapping-v3-core/mapping-v3-core.test.ts +++ b/tests/subgraph/mapping-v3-core/mapping-v3-core.test.ts @@ -1519,6 +1519,13 @@ describe(`${coreType}: handleProjectUpdated`, () => { handleProjectUpdated(event); + const createdProject = Project.load( + generateContractSpecificId(TEST_CONTRACT_ADDRESS, projectId) + ); + if (createdProject === null) { + throw new Error("Project not created"); + } + // Artist entity assert.fieldEquals( ACCOUNT_ENTITY_TYPE, @@ -1564,24 +1571,16 @@ describe(`${coreType}: handleProjectUpdated`, () => { "createdAt", CURRENT_BLOCK_TIMESTAMP.toString() ); - assert.fieldEquals( - PROJECT_ENTITY_TYPE, - generateContractSpecificId(TEST_CONTRACT_ADDRESS, projectId), - "currencyAddress", - Address.zero().toHexString() - ); - assert.fieldEquals( - PROJECT_ENTITY_TYPE, - generateContractSpecificId(TEST_CONTRACT_ADDRESS, projectId), - "currencySymbol", - "ETH" - ); - assert.fieldEquals( - PROJECT_ENTITY_TYPE, - generateContractSpecificId(TEST_CONTRACT_ADDRESS, projectId), - "dynamic", - "true" + + // No currencyAddress or currencySymbol on project for v3 and up + assert.assertNull(createdProject.currencySymbol); + // Excuse the funky test here, matchstick was barfing on a null check + assert.assertTrue( + (createdProject.currencyAddress + ? (createdProject.currencyAddress as Address).toHexString() + : "") === "" ); + assert.fieldEquals( PROJECT_ENTITY_TYPE, generateContractSpecificId(TEST_CONTRACT_ADDRESS, projectId), diff --git a/tests/subgraph/mapping-v3-core/mapping-v3-engine-core-minter-updated.test.ts b/tests/subgraph/mapping-v3-core/mapping-v3-engine-core-minter-updated.test.ts index 47fbf71a..504f6177 100644 --- a/tests/subgraph/mapping-v3-core/mapping-v3-engine-core-minter-updated.test.ts +++ b/tests/subgraph/mapping-v3-core/mapping-v3-engine-core-minter-updated.test.ts @@ -279,6 +279,7 @@ test(`${coreType}/MinterUpdated: should populate project minter configurations f const project0BasePrice = BigInt.fromI32(0); const project0CurrencySymbol = "ETH"; const project0CurrencyAddress = Address.zero(); + const project0CurrencyDecimals = 18; const project0PurchaseToDisabled = true; const project0MinterType = "MinterSetPriceV2"; @@ -291,6 +292,7 @@ test(`${coreType}/MinterUpdated: should populate project minter configurations f previousMinterConfig0.priceIsConfigured = project0PriceIsConfigured; previousMinterConfig0.currencyAddress = project0CurrencyAddress; previousMinterConfig0.currencySymbol = project0CurrencySymbol; + previousMinterConfig0.currencyDecimals = project0CurrencyDecimals; previousMinterConfig0.purchaseToDisabled = project0PurchaseToDisabled; previousMinterConfig0.extraMinterDetails = "{}"; @@ -313,6 +315,7 @@ test(`${coreType}/MinterUpdated: should populate project minter configurations f const project1BasePrice = BigInt.fromI64(i64(1e18)); const project1CurrencySymbol = "DAI"; const project1CurrencyAddress = randomAddressGenerator.generateRandomAddress(); + const project1CurrencyDecimals = 18; const project1PurchaseToDisabled = false; const project1MinterType = "MinterSetPriceERC20V2"; @@ -328,6 +331,7 @@ test(`${coreType}/MinterUpdated: should populate project minter configurations f previousMinterConfig1.priceIsConfigured = project1PriceIsConfigured; previousMinterConfig1.currencyAddress = project1CurrencyAddress; previousMinterConfig1.currencySymbol = project1CurrencySymbol; + previousMinterConfig1.currencyDecimals = project1CurrencyDecimals; previousMinterConfig1.purchaseToDisabled = project1PurchaseToDisabled; previousMinterConfig1.extraMinterDetails = "{}"; @@ -352,6 +356,7 @@ test(`${coreType}/MinterUpdated: should populate project minter configurations f const project2PriceIsConfigured = true; const project2CurrencySymbol = "ETH"; const project2CurrencyAddress = Address.zero(); + const project2CurrencyDecimals = 18; const project2PurchaseToDisabled = false; const project2StartTime = CURRENT_BLOCK_TIMESTAMP.plus(BigInt.fromI32(100)); const project2EndTime = CURRENT_BLOCK_TIMESTAMP.plus(BigInt.fromI32(3700)); @@ -368,6 +373,7 @@ test(`${coreType}/MinterUpdated: should populate project minter configurations f previousMinterConfig2.priceIsConfigured = project2PriceIsConfigured; previousMinterConfig2.currencyAddress = project2CurrencyAddress; previousMinterConfig2.currencySymbol = project2CurrencySymbol; + previousMinterConfig2.currencyDecimals = project2CurrencyDecimals; previousMinterConfig2.purchaseToDisabled = project2PurchaseToDisabled; previousMinterConfig2.extraMinterDetails = getJSONStringFromEntries([ { key: "startTime", value: toJSONValue(project2StartTime) }, @@ -399,6 +405,7 @@ test(`${coreType}/MinterUpdated: should populate project minter configurations f const project3CurrencySymbol = "ETH"; const project3CurrencyAddress = Address.zero(); const project3PurchaseToDisabled = false; + const project3CurrencyDecimals = 18; const project3StartTime = CURRENT_BLOCK_TIMESTAMP.plus(BigInt.fromI32(100)); const project3HalfLifeSeconds = BigInt.fromI32(500); const project3StartPrice = ONE_ETH_IN_WEI.times(BigInt.fromI32(2)); @@ -414,6 +421,7 @@ test(`${coreType}/MinterUpdated: should populate project minter configurations f previousMinterConfig3.priceIsConfigured = project3PriceIsConfigured; previousMinterConfig3.currencyAddress = project3CurrencyAddress; previousMinterConfig3.currencySymbol = project3CurrencySymbol; + previousMinterConfig3.currencyDecimals = project3CurrencyDecimals; previousMinterConfig3.purchaseToDisabled = project3PurchaseToDisabled; previousMinterConfig3.extraMinterDetails = getJSONStringFromEntries([ { key: "startTime", value: toJSONValue(project3StartTime) }, diff --git a/tests/subgraph/mapping-v3-core/mapping-v3-engine-core.test.ts b/tests/subgraph/mapping-v3-core/mapping-v3-engine-core.test.ts index 798de112..28261d69 100644 --- a/tests/subgraph/mapping-v3-core/mapping-v3-engine-core.test.ts +++ b/tests/subgraph/mapping-v3-core/mapping-v3-engine-core.test.ts @@ -1546,6 +1546,14 @@ describe(`${coreType}: handleProjectUpdated`, () => { handleProjectUpdated(event); + const createdProject = Project.load( + generateContractSpecificId(TEST_CONTRACT_ADDRESS, projectId) + ); + + if (!createdProject) { + throw new Error("Project entity not created"); + } + // Artist entity assert.fieldEquals( ACCOUNT_ENTITY_TYPE, @@ -1579,24 +1587,16 @@ describe(`${coreType}: handleProjectUpdated`, () => { "contract", TEST_CONTRACT_ADDRESS.toHexString() ); - assert.fieldEquals( - PROJECT_ENTITY_TYPE, - generateContractSpecificId(TEST_CONTRACT_ADDRESS, projectId), - "createdAt", - CURRENT_BLOCK_TIMESTAMP.toString() - ); - assert.fieldEquals( - PROJECT_ENTITY_TYPE, - generateContractSpecificId(TEST_CONTRACT_ADDRESS, projectId), - "currencyAddress", - Address.zero().toHexString() - ); - assert.fieldEquals( - PROJECT_ENTITY_TYPE, - generateContractSpecificId(TEST_CONTRACT_ADDRESS, projectId), - "currencySymbol", - "ETH" + + // No currencyAddress or currencySymbol on project for v3 and up + assert.assertNull(createdProject.currencySymbol); + // Excuse the funky test here, matchstick was barfing on a null check + assert.assertTrue( + (createdProject.currencyAddress + ? (createdProject.currencyAddress as Address).toHexString() + : "") === "" ); + assert.fieldEquals( PROJECT_ENTITY_TYPE, generateContractSpecificId(TEST_CONTRACT_ADDRESS, projectId), diff --git a/tests/subgraph/mapping-v3-core/mapping-v3-engine-flex-core.test.ts b/tests/subgraph/mapping-v3-core/mapping-v3-engine-flex-core.test.ts index 54e3cda8..b7624888 100644 --- a/tests/subgraph/mapping-v3-core/mapping-v3-engine-flex-core.test.ts +++ b/tests/subgraph/mapping-v3-core/mapping-v3-engine-flex-core.test.ts @@ -1253,6 +1253,13 @@ describe(`${coreType}: handleProjectUpdated`, () => { handleProjectUpdated(event); + const createdProject = Project.load( + generateContractSpecificId(TEST_CONTRACT_ADDRESS, projectId) + ); + if (!createdProject) { + throw new Error("Project entity not created"); + } + // Artist entity assert.fieldEquals( ACCOUNT_ENTITY_TYPE, @@ -1286,24 +1293,16 @@ describe(`${coreType}: handleProjectUpdated`, () => { "contract", TEST_CONTRACT_ADDRESS.toHexString() ); - assert.fieldEquals( - PROJECT_ENTITY_TYPE, - generateContractSpecificId(TEST_CONTRACT_ADDRESS, projectId), - "createdAt", - CURRENT_BLOCK_TIMESTAMP.toString() - ); - assert.fieldEquals( - PROJECT_ENTITY_TYPE, - generateContractSpecificId(TEST_CONTRACT_ADDRESS, projectId), - "currencyAddress", - Address.zero().toHexString() - ); - assert.fieldEquals( - PROJECT_ENTITY_TYPE, - generateContractSpecificId(TEST_CONTRACT_ADDRESS, projectId), - "currencySymbol", - "ETH" + + // No currencyAddress or currencySymbol on project for v3 and up + assert.assertNull(createdProject.currencySymbol); + // Excuse the funky test here, matchstick was barfing on a null check + assert.assertTrue( + (createdProject.currencyAddress + ? (createdProject.currencyAddress as Address).toHexString() + : "") === "" ); + assert.fieldEquals( PROJECT_ENTITY_TYPE, generateContractSpecificId(TEST_CONTRACT_ADDRESS, projectId), diff --git a/tests/subgraph/mapping-v3-core/mapping-v3p2-engine-core.test.ts b/tests/subgraph/mapping-v3-core/mapping-v3p2-engine-core.test.ts index 35c1cd13..1091e862 100644 --- a/tests/subgraph/mapping-v3-core/mapping-v3p2-engine-core.test.ts +++ b/tests/subgraph/mapping-v3-core/mapping-v3p2-engine-core.test.ts @@ -1468,6 +1468,14 @@ describe(`${coreType}-${coreVersion}: handleProjectUpdated`, () => { handleProjectUpdated(event); + const createdProject = Project.load( + generateContractSpecificId(TEST_CONTRACT_ADDRESS, projectId) + ); + + if (!createdProject) { + throw new Error("Project entity not created"); + } + // Artist entity assert.fieldEquals( ACCOUNT_ENTITY_TYPE, @@ -1507,18 +1515,16 @@ describe(`${coreType}-${coreVersion}: handleProjectUpdated`, () => { "createdAt", CURRENT_BLOCK_TIMESTAMP.toString() ); - assert.fieldEquals( - PROJECT_ENTITY_TYPE, - generateContractSpecificId(TEST_CONTRACT_ADDRESS, projectId), - "currencyAddress", - Address.zero().toHexString() - ); - assert.fieldEquals( - PROJECT_ENTITY_TYPE, - generateContractSpecificId(TEST_CONTRACT_ADDRESS, projectId), - "currencySymbol", - "ETH" + + // No currencyAddress or currencySymbol on project for v3 and up + assert.assertNull(createdProject.currencySymbol); + // Excuse the funky test here, matchstick was barfing on a null check + assert.assertTrue( + (createdProject.currencyAddress + ? (createdProject.currencyAddress as Address).toHexString() + : "") === "" ); + assert.fieldEquals( PROJECT_ENTITY_TYPE, generateContractSpecificId(TEST_CONTRACT_ADDRESS, projectId), diff --git a/tests/subgraph/shared-helpers.ts b/tests/subgraph/shared-helpers.ts index b5808a56..7e2a5ee0 100644 --- a/tests/subgraph/shared-helpers.ts +++ b/tests/subgraph/shared-helpers.ts @@ -232,6 +232,7 @@ export class DefaultProjectValues { completedAt: BigInt; currencyAddress: Address; currencySymbol: string; + currencyDecimals: i32; description: string; dynamic: boolean; invocations: BigInt; @@ -270,6 +271,7 @@ export const DEFAULT_PROJECT_VALUES: DefaultProjectValues = { completedAt: BigInt.fromI32(0), currencyAddress: Address.zero(), currencySymbol: "ETH", + currencyDecimals: 18, description: "", dynamic: true, invocations: BigInt.zero(), @@ -516,6 +518,7 @@ export const addNewLegacyProjectMinterConfigToStore = ( projectMinterConfig.priceIsConfigured = false; projectMinterConfig.currencyAddress = Address.zero(); projectMinterConfig.currencySymbol = "ETH"; + projectMinterConfig.currencyDecimals = 18; projectMinterConfig.purchaseToDisabled = false; projectMinterConfig.extraMinterDetails = "{}"; @@ -785,3 +788,14 @@ export function getJsonStringFromInputs( // use helper function to convert from typed map to json string return typedMapToJSONString(jsonMapping); } + +export function mockCurrencyDecimals( + contractAddress: Address, + decimals: i32 +): void { + createMockedFunction( + contractAddress, + "decimals", + "decimals():(uint8)" + ).returns([ethereum.Value.fromI32(decimals)]); +} diff --git a/yarn.lock b/yarn.lock index ebf85d0d..0bdabf0b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2570,10 +2570,10 @@ make-error@^1.1.1: resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== -matchstick-as@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/matchstick-as/-/matchstick-as-0.5.2.tgz#6a6dde02d1d939c32458bd67bac688891a07a34c" - integrity sha512-fb1OVphDKEvJY06Ue02Eh1CNncuW95vp6b8tNAP7UIqplICSLoU/zgN6U7ge7R0upsoO78C7CRi4EyK/7Jxz7g== +matchstick-as@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/matchstick-as/-/matchstick-as-0.6.0.tgz#c65296b1f51b1014d605c52067d9b5321ea630e8" + integrity sha512-E36fWsC1AbCkBFt05VsDDRoFvGSdcZg6oZJrtIe/YDBbuFh8SKbR5FcoqDhNWqSN+F7bN/iS2u8Md0SM+4pUpw== dependencies: wabt "1.0.24"