{
  "schema": "numina.nusd.settlement-candidate.v1",
  "contractName": "NuminaSettlement",
  "sourceName": "contracts/NuminaSettlement.sol",
  "compiler": "0.8.37+commit.f401782d.Emscripten.clang",
  "compilerSettings": {
    "optimizer": {
      "enabled": true,
      "runs": 200
    },
    "evmVersion": "london",
    "metadata": {
      "bytecodeHash": "ipfs"
    },
    "outputSelection": {
      "*": {
        "*": [
          "abi",
          "evm.bytecode.object",
          "evm.deployedBytecode.object",
          "metadata"
        ]
      }
    }
  },
  "sourceSha256": "dddf53004f2eb8b427ba29452eb741c473f8f072ff5b7a095302b6d5df4231fb",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "nusdToken",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "expected",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "beforeBalance",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "afterBalance",
          "type": "uint256"
        }
      ],
      "name": "InexactTokenReceipt",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidSettlement",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidToken",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "payer",
          "type": "address"
        },
        {
          "internalType": "bytes32",
          "name": "operationId",
          "type": "bytes32"
        }
      ],
      "name": "OperationMutation",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ReentrancyGuardReentrantCall",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "SafeERC20FailedOperation",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "payer",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "operationId",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "Settled",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "nusd",
      "outputs": [
        {
          "internalType": "contract IERC20",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "operationId",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "settle",
      "outputs": [
        {
          "components": [
            {
              "internalType": "address",
              "name": "recipient",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "amount",
              "type": "uint256"
            },
            {
              "internalType": "bool",
              "name": "completed",
              "type": "bool"
            }
          ],
          "internalType": "struct NuminaSettlement.Settlement",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "payer",
          "type": "address"
        },
        {
          "internalType": "bytes32",
          "name": "operationId",
          "type": "bytes32"
        }
      ],
      "name": "settlements",
      "outputs": [
        {
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "bool",
          "name": "completed",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "bytecode": "0x60a060405234801561001057600080fd5b5060405161077d38038061077d83398101604081905261002f91610081565b60016000556001600160a01b038116158061005257506001600160a01b0381163b155b156100705760405163c1ab6dc160e01b815260040160405180910390fd5b6001600160a01b03166080526100b1565b60006020828403121561009357600080fd5b81516001600160a01b03811681146100aa57600080fd5b9392505050565b60805161069d6100e06000396000818160bb0152818161028701528181610303015261034d015261069d6000f3fe608060405234801561001057600080fd5b50600436106100405760003560e01c8062db7eb31461004557806314db20ac146100b6578063acd28cc5146100f5575b600080fd5b61008a6100533660046105c8565b600160208181526000938452604080852090915291835291208054918101546002909101546001600160a01b039092169160ff1683565b604080516001600160a01b03909416845260208401929092521515908201526060015b60405180910390f35b6100dd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100ad565b6101086101033660046105f2565b610135565b6040805182516001600160a01b0316815260208084015190820152918101511515908201526060016100ad565b604080516060810182526000808252602082018190529181019190915261015a6104b1565b83158061016e57506001600160a01b038316155b8061018157506001600160a01b03831633145b8061019457506001600160a01b03831630145b8061019d575081155b156101bb576040516304564c7160e21b815260040160405180910390fd5b3360009081526001602090815260408083208784529091529020600281015460ff16156102655780546001600160a01b038581169116141580610202575082816001015414155b1561022e5760405163a34b467360e01b8152336004820152602481018690526044015b60405180910390fd5b6040805160608101825282546001600160a01b031681526001830154602082015260029092015460ff1615159082015290506104a0565b6040516370a0823160e01b81526001600160a01b0385811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa1580156102d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102f49190610627565b905061032b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163387876104db565b6040516370a0823160e01b81526001600160a01b0386811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015610396573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ba9190610627565b9050818110806103d35750846103d08383610640565b14155b156104025760405163a076e0a760e01b8152600481018690526024810183905260448101829052606401610225565b82546001600160a01b0319166001600160a01b0387169081178455600180850187905560028501805460ff19169091179055604051868152889033907fa42dfca86dff15428f61b210e452622779752acaf3d3634d4ce6cd7d5b7517ec9060200160405180910390a450506040805160608101825282546001600160a01b031681526001830154602082015260029092015460ff1615159082015290505b6104aa6001600055565b9392505050565b6002600054036104d457604051633ee5aeb560e01b815260040160405180910390fd5b6002600055565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261053590859061053b565b50505050565b600080602060008451602086016000885af18061055e576040513d6000823e3d81fd5b50506000513d91508115610576578060011415610583565b6001600160a01b0384163b155b1561053557604051635274afe760e01b81526001600160a01b0385166004820152602401610225565b80356001600160a01b03811681146105c357600080fd5b919050565b600080604083850312156105db57600080fd5b6105e4836105ac565b946020939093013593505050565b60008060006060848603121561060757600080fd5b83359250610617602085016105ac565b9150604084013590509250925092565b60006020828403121561063957600080fd5b5051919050565b8181038181111561066157634e487b7160e01b600052601160045260246000fd5b9291505056fea26469706673582212208c7687ca3fdcc90809006706c618c553c4de98a824969db0568fa30faa5e034564736f6c63430008250033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100405760003560e01c8062db7eb31461004557806314db20ac146100b6578063acd28cc5146100f5575b600080fd5b61008a6100533660046105c8565b600160208181526000938452604080852090915291835291208054918101546002909101546001600160a01b039092169160ff1683565b604080516001600160a01b03909416845260208401929092521515908201526060015b60405180910390f35b6100dd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100ad565b6101086101033660046105f2565b610135565b6040805182516001600160a01b0316815260208084015190820152918101511515908201526060016100ad565b604080516060810182526000808252602082018190529181019190915261015a6104b1565b83158061016e57506001600160a01b038316155b8061018157506001600160a01b03831633145b8061019457506001600160a01b03831630145b8061019d575081155b156101bb576040516304564c7160e21b815260040160405180910390fd5b3360009081526001602090815260408083208784529091529020600281015460ff16156102655780546001600160a01b038581169116141580610202575082816001015414155b1561022e5760405163a34b467360e01b8152336004820152602481018690526044015b60405180910390fd5b6040805160608101825282546001600160a01b031681526001830154602082015260029092015460ff1615159082015290506104a0565b6040516370a0823160e01b81526001600160a01b0385811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa1580156102d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102f49190610627565b905061032b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163387876104db565b6040516370a0823160e01b81526001600160a01b0386811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015610396573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ba9190610627565b9050818110806103d35750846103d08383610640565b14155b156104025760405163a076e0a760e01b8152600481018690526024810183905260448101829052606401610225565b82546001600160a01b0319166001600160a01b0387169081178455600180850187905560028501805460ff19169091179055604051868152889033907fa42dfca86dff15428f61b210e452622779752acaf3d3634d4ce6cd7d5b7517ec9060200160405180910390a450506040805160608101825282546001600160a01b031681526001830154602082015260029092015460ff1615159082015290505b6104aa6001600055565b9392505050565b6002600054036104d457604051633ee5aeb560e01b815260040160405180910390fd5b6002600055565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261053590859061053b565b50505050565b600080602060008451602086016000885af18061055e576040513d6000823e3d81fd5b50506000513d91508115610576578060011415610583565b6001600160a01b0384163b155b1561053557604051635274afe760e01b81526001600160a01b0385166004820152602401610225565b80356001600160a01b03811681146105c357600080fd5b919050565b600080604083850312156105db57600080fd5b6105e4836105ac565b946020939093013593505050565b60008060006060848603121561060757600080fd5b83359250610617602085016105ac565b9150604084013590509250925092565b60006020828403121561063957600080fd5b5051919050565b8181038181111561066157634e487b7160e01b600052601160045260246000fd5b9291505056fea26469706673582212208c7687ca3fdcc90809006706c618c553c4de98a824969db0568fa30faa5e034564736f6c63430008250033",
  "metadata": {
    "compiler": {
      "version": "0.8.37+commit.f401782d"
    },
    "language": "Solidity",
    "output": {
      "abi": [
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "nusdToken",
              "type": "address"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "constructor"
        },
        {
          "inputs": [
            {
              "internalType": "uint256",
              "name": "expected",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "beforeBalance",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "afterBalance",
              "type": "uint256"
            }
          ],
          "name": "InexactTokenReceipt",
          "type": "error"
        },
        {
          "inputs": [],
          "name": "InvalidSettlement",
          "type": "error"
        },
        {
          "inputs": [],
          "name": "InvalidToken",
          "type": "error"
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "payer",
              "type": "address"
            },
            {
              "internalType": "bytes32",
              "name": "operationId",
              "type": "bytes32"
            }
          ],
          "name": "OperationMutation",
          "type": "error"
        },
        {
          "inputs": [],
          "name": "ReentrancyGuardReentrantCall",
          "type": "error"
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "token",
              "type": "address"
            }
          ],
          "name": "SafeERC20FailedOperation",
          "type": "error"
        },
        {
          "anonymous": false,
          "inputs": [
            {
              "indexed": true,
              "internalType": "address",
              "name": "payer",
              "type": "address"
            },
            {
              "indexed": true,
              "internalType": "bytes32",
              "name": "operationId",
              "type": "bytes32"
            },
            {
              "indexed": true,
              "internalType": "address",
              "name": "recipient",
              "type": "address"
            },
            {
              "indexed": false,
              "internalType": "uint256",
              "name": "amount",
              "type": "uint256"
            }
          ],
          "name": "Settled",
          "type": "event"
        },
        {
          "inputs": [],
          "name": "nusd",
          "outputs": [
            {
              "internalType": "contract IERC20",
              "name": "",
              "type": "address"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        },
        {
          "inputs": [
            {
              "internalType": "bytes32",
              "name": "operationId",
              "type": "bytes32"
            },
            {
              "internalType": "address",
              "name": "recipient",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "amount",
              "type": "uint256"
            }
          ],
          "name": "settle",
          "outputs": [
            {
              "components": [
                {
                  "internalType": "address",
                  "name": "recipient",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "amount",
                  "type": "uint256"
                },
                {
                  "internalType": "bool",
                  "name": "completed",
                  "type": "bool"
                }
              ],
              "internalType": "struct NuminaSettlement.Settlement",
              "name": "",
              "type": "tuple"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function"
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "payer",
              "type": "address"
            },
            {
              "internalType": "bytes32",
              "name": "operationId",
              "type": "bytes32"
            }
          ],
          "name": "settlements",
          "outputs": [
            {
              "internalType": "address",
              "name": "recipient",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "amount",
              "type": "uint256"
            },
            {
              "internalType": "bool",
              "name": "completed",
              "type": "bool"
            }
          ],
          "stateMutability": "view",
          "type": "function"
        }
      ],
      "devdoc": {
        "details": "The constructor token identity must be independently checked before deployment. Custom code has not received an independent security audit.",
        "errors": {
          "ReentrancyGuardReentrantCall()": [
            {
              "details": "Unauthorized reentrant call."
            }
          ],
          "SafeERC20FailedOperation(address)": [
            {
              "details": "An operation with an ERC-20 token failed."
            }
          ]
        },
        "kind": "dev",
        "methods": {
          "settle(bytes32,address,uint256)": {
            "details": "IDs are scoped to the caller. Failed transfers leave no completed record; all effects revert. Amounts are the configured token's base units, not a declared valuation or external asset balance."
          }
        },
        "title": "Numina NUSD token settlement candidate.",
        "version": 1
      },
      "userdoc": {
        "kind": "user",
        "methods": {
          "settle(bytes32,address,uint256)": {
            "notice": "An exact retry returns its existing result without another token movement or event."
          }
        },
        "notice": "Moves an existing NUSD token balance from the caller to an explicit recipient. No issuance, USD/USDC conversion, bank deposit, reserve verification or fiat redemption.",
        "version": 1
      }
    },
    "settings": {
      "compilationTarget": {
        "contracts/NuminaSettlement.sol": "NuminaSettlement"
      },
      "evmVersion": "london",
      "libraries": {},
      "metadata": {
        "bytecodeHash": "ipfs"
      },
      "optimizer": {
        "enabled": true,
        "runs": 200
      },
      "remappings": []
    },
    "sources": {
      "@openzeppelin/contracts/interfaces/IERC1363.sol": {
        "keccak256": "0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d",
        "license": "MIT",
        "urls": [
          "bzz-raw://da5e832b40fc5c3145d3781e2e5fa60ac2052c9d08af7e300dc8ab80c4343100",
          "dweb:/ipfs/QmTzf7N5ZUdh5raqtzbM11yexiUoLC9z3Ws632MCuycq1d"
        ]
      },
      "@openzeppelin/contracts/interfaces/IERC165.sol": {
        "keccak256": "0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc",
        "license": "MIT",
        "urls": [
          "bzz-raw://1c299900ac4ec268d4570ecef0d697a3013cd11a6eb74e295ee3fbc945056037",
          "dweb:/ipfs/Qmab9owJoxcA7vJT5XNayCMaUR1qxqj1NDzzisduwaJMcZ"
        ]
      },
      "@openzeppelin/contracts/interfaces/IERC20.sol": {
        "keccak256": "0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44",
        "license": "MIT",
        "urls": [
          "bzz-raw://1bb2332a7ee26dd0b0de9b7fe266749f54820c99ab6a3bcb6f7e6b751d47ee2d",
          "dweb:/ipfs/QmcRWpaBeCYkhy68PR3B4AgD7asuQk7PwkWxrvJbZcikLF"
        ]
      },
      "@openzeppelin/contracts/token/ERC20/IERC20.sol": {
        "keccak256": "0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2",
        "license": "MIT",
        "urls": [
          "bzz-raw://5282825a626cfe924e504274b864a652b0023591fa66f06a067b25b51ba9b303",
          "dweb:/ipfs/QmeCfPykghhMc81VJTrHTC7sF6CRvaA1FXVq2pJhwYp1dV"
        ]
      },
      "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol": {
        "keccak256": "0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5",
        "license": "MIT",
        "urls": [
          "bzz-raw://8150ceb4ac947e8a442b2a9c017e01e880b2be2dd958f1fa9bc405f4c5a86508",
          "dweb:/ipfs/QmbcBmFX66AY6Kbhnd5gx7zpkgqnUafo43XnmayAM7zVdB"
        ]
      },
      "@openzeppelin/contracts/utils/ReentrancyGuard.sol": {
        "keccak256": "0x11a5a79827df29e915a12740caf62fe21ebe27c08c9ae3e09abe9ee3ba3866d3",
        "license": "MIT",
        "urls": [
          "bzz-raw://3cf0c69ab827e3251db9ee6a50647d62c90ba580a4d7bbff21f2bea39e7b2f4a",
          "dweb:/ipfs/QmZiKwtKU1SBX4RGfQtY7PZfiapbbu6SZ9vizGQD9UHjRA"
        ]
      },
      "@openzeppelin/contracts/utils/introspection/IERC165.sol": {
        "keccak256": "0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c",
        "license": "MIT",
        "urls": [
          "bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617",
          "dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u"
        ]
      },
      "contracts/NuminaSettlement.sol": {
        "keccak256": "0xb5935d14376348f5183de7499e257195faafde2fbb38c7dee2cdd753b7062a97",
        "license": "UNLICENSED",
        "urls": [
          "bzz-raw://605c3c1b113df27304ae4978fb6bd6052faf7e61b2fd0137759e92dd5d29629a",
          "dweb:/ipfs/QmapLsgS1gwS6BfTTRJsUrQWE7BA4s9Jw14mhmcfDvxMwX"
        ]
      }
    },
    "version": 1
  },
  "dependencies": {
    "@openzeppelin/contracts": "5.4.0"
  }
}
