Contrat
Contrat
0xa8e7668576…b6ea4b913e
0xa8e7668576dc0b6490dba71fd53965b6ea4b913e
Solde WTG
10746.085171 WTG
≈ 258 037,89 FCFA (@ 24,01 FCFA/WTG)
Avoirs en tokens
0 token
≈ 0,00 FCFA
Plus d'infos
Transactions envoyées1
Dernière activitéil y a 1 min
Première activitéil y a 5 h
Financé par
—
Code du contrat
✓ VérifiéWintgEntryPoint · Solidity v0.8.20+commit.a1b79de6 · optimiseur activé (200 runs) · licence Apache-2.0
// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.20;
import { PackedUserOperation, IAccount, IPaymaster } from "./interfaces.sol";
/// @title WintgEntryPoint — minimal ERC-4337 v0.7 EntryPoint for the WINTG devnet
/// @notice Singleton that bundlers call with {handleOps}. It validates each
/// UserOperation (account + optional paymaster), executes the call, and
/// settles gas from the payer's deposit. Faithful to v0.7 packing/hashing
/// so signatures match {WintgAccount}; trimmed of mainnet hardening
/// (stake manager, deep simulation). Devnet reference, not audited.
contract WintgEntryPoint {
mapping(address => uint256) public deposits; // account/paymaster gas balance
mapping(address => mapping(uint192 => uint64)) public nonceSeq; // sender => key => sequence
event Deposited(address indexed account, uint256 totalDeposit);
event Withdrawn(address indexed account, address to, uint256 amount);
event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory);
event UserOperationEvent(
bytes32 indexed userOpHash,
address indexed sender,
address indexed paymaster,
uint256 nonce,
bool success,
uint256 actualGasCost,
uint256 actualGasUsed
);
event UserOperationRevertReason(bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason);
error FailedOp(uint256 opIndex, string reason);
// ───────────────────────── deposits ─────────────────────────
function depositTo(address account) public payable {
deposits[account] += msg.value;
emit Deposited(account, deposits[account]);
}
receive() external payable {
deposits[msg.sender] += msg.value;
emit Deposited(msg.sender, deposits[msg.sender]);
}
function balanceOf(address account) external view returns (uint256) {
return deposits[account];
}
function withdrawTo(address payable to, uint256 amount) external {
require(deposits[msg.sender] >= amount, "EP: insufficient deposit");
deposits[msg.sender] -= amount;
(bool ok, ) = to.call{ value: amount }("");
require(ok, "EP: withdraw failed");
emit Withdrawn(msg.sender, to, amount);
}
// 4337 stake API (no-op accounting on devnet, kept for interface compatibility)
function addStake(uint32) external payable { deposits[msg.sender] += msg.value; }
function unlockStake() external {}
function withdrawStake(address payable) external {}
// ───────────────────────── nonces ─────────────────────────
function getNonce(address sender, uint192 key) external view returns (uint256) {
return (uint256(key) << 64) | nonceSeq[sender][key];
}
// ───────────────────────── hashing ─────────────────────────
function getUserOpHash(PackedUserOperation calldata op) public view returns (bytes32) {
bytes32 inner = keccak256(
abi.encode(
op.sender,
op.nonce,
keccak256(op.initCode),
keccak256(op.callData),
op.accountGasLimits,
op.preVerificationGas,
op.gasFees,
keccak256(op.paymasterAndData)
)
);
return keccak256(abi.encode(inner, address(this), block.chainid));
}
// ───────────────────────── execution ─────────────────────────
function handleOps(PackedUserOperation[] calldata ops, address payable beneficiary) external {
uint256 collected;
for (uint256 i; i < ops.length; i++) {
collected += _handleOp(i, ops[i]);
}
if (collected > 0) {
(bool ok, ) = beneficiary.call{ value: collected }("");
require(ok, "EP: beneficiary xfer");
}
}
function _handleOp(uint256 opIndex, PackedUserOperation calldata op) internal returns (uint256 actualGasCost) {
uint256 preGas = gasleft();
bytes32 opHash = getUserOpHash(op);
// --- nonce ---
uint192 key = uint192(op.nonce >> 64);
uint64 seq = uint64(op.nonce);
if (nonceSeq[op.sender][key] != seq) revert FailedOp(opIndex, "AA25 invalid nonce");
nonceSeq[op.sender][key] = seq + 1;
// --- deploy account from initCode if needed ---
if (op.initCode.length >= 20) {
_createSender(op.initCode);
emit AccountDeployed(opHash, op.sender, address(bytes20(op.initCode[:20])));
}
uint256 maxFee = uint128(uint256(op.gasFees));
uint256 verGas = uint256(op.accountGasLimits) >> 128;
uint256 callGas = uint128(uint256(op.accountGasLimits));
uint256 maxCost = (verGas + callGas + op.preVerificationGas) * maxFee;
address paymaster = op.paymasterAndData.length >= 20 ? address(bytes20(op.paymasterAndData[:20])) : address(0);
// --- account validation (pays its prefund if no paymaster) ---
uint256 missing = 0;
if (paymaster == address(0)) {
uint256 bal = deposits[op.sender];
missing = bal >= maxCost ? 0 : maxCost - bal;
}
uint256 vd = IAccount(op.sender).validateUserOp(op, opHash, missing);
_validate(opIndex, vd, "AA24 signature error");
if (missing > 0) deposits[op.sender] += missing; // account refunded its prefund into its deposit
// --- paymaster validation ---
bytes memory context;
if (paymaster != address(0)) {
if (deposits[paymaster] < maxCost) revert FailedOp(opIndex, "AA31 paymaster deposit too low");
(context, vd) = IPaymaster(paymaster).validatePaymasterUserOp(op, opHash, maxCost);
_validate(opIndex, vd, "AA34 paymaster signature");
}
// --- execution ---
(bool success, bytes memory ret) = op.sender.call{ gas: callGas }(op.callData);
if (!success) {
emit UserOperationRevertReason(opHash, op.sender, op.nonce, ret);
}
// --- gas settlement ---
uint256 gasUsed = preGas - gasleft() + op.preVerificationGas;
actualGasCost = gasUsed * maxFee;
address payer = paymaster == address(0) ? op.sender : paymaster;
if (deposits[payer] < actualGasCost) revert FailedOp(opIndex, "AA21 didn't pay prefund");
deposits[payer] -= actualGasCost;
if (paymaster != address(0)) {
IPaymaster(paymaster).postOp(
success ? IPaymaster.PostOpMode.opSucceeded : IPaymaster.PostOpMode.opReverted,
context,
actualGasCost,
gasUsed
);
}
emit UserOperationEvent(opHash, op.sender, paymaster, op.nonce, success, actualGasCost, gasUsed);
}
/// @dev Reverts unless validationData is valid (sig ok + time window ok).
function _validate(uint256 opIndex, uint256 vd, string memory sigErr) internal view {
if (vd & 1 == 1) revert FailedOp(opIndex, sigErr);
uint48 validUntil = uint48(vd >> 160);
uint48 validAfter = uint48(vd >> 208);
if (validAfter != 0 && block.timestamp < validAfter) revert FailedOp(opIndex, "AA22 not valid yet");
if (validUntil != 0 && block.timestamp > validUntil) revert FailedOp(opIndex, "AA22 expired");
}
/// @dev Deploy the account: initCode = factory(20 bytes) ++ calldata.
function _createSender(bytes calldata initCode) internal {
address factory = address(bytes20(initCode[:20]));
bytes calldata data = initCode[20:];
(bool ok, ) = factory.call(data);
require(ok, "EP: account creation failed");
}
}
[
{
"type": "receive",
"stateMutability": "payable"
},
{
"type": "function",
"name": "addStake",
"inputs": [
{
"name": "",
"type": "uint32",
"internalType": "uint32"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"type": "function",
"name": "balanceOf",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"type": "function",
"name": "depositTo",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"type": "function",
"name": "deposits",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"type": "function",
"name": "getNonce",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
},
{
"name": "key",
"type": "uint192",
"internalType": "uint192"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"type": "function",
"name": "getUserOpHash",
"inputs": [
{
"name": "op",
"type": "tuple",
"internalType": "struct PackedUserOperation",
"components": [
{
"name": "sender",
"type": "address",
"internalType": "address"
},
{
"name": "nonce",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "initCode",
"type": "bytes",
"internalType": "bytes"
},
{
"name": "callData",
"type": "bytes",
"internalType": "bytes"
},
{
"name": "accountGasLimits",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "preVerificationGas",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "gasFees",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "paymasterAndData",
"type": "bytes",
"internalType": "bytes"
},
{
"name": "signature",
"type": "bytes",
"internalType": "bytes"
}
]
}
],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"type": "function",
"name": "handleOps",
"inputs": [
{
"name": "ops",
"type": "tuple[]",
"internalType": "struct PackedUserOperation[]",
"components": [
{
"name": "sender",
"type": "address",
"internalType": "address"
},
{
"name": "nonce",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "initCode",
"type": "bytes",
"internalType": "bytes"
},
{
"name": "callData",
"type": "bytes",
"internalType": "bytes"
},
{
"name": "accountGasLimits",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "preVerificationGas",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "gasFees",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "paymasterAndData",
"type": "bytes",
"internalType": "bytes"
},
{
"name": "signature",
"type": "bytes",
"internalType": "bytes"
}
]
},
{
"name": "beneficiary",
"type": "address",
"internalType": "address payable"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"type": "function",
"name": "nonceSeq",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
},
{
"name": "",
"type": "uint192",
"internalType": "uint192"
}
],
"outputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"type": "function",
"name": "unlockStake",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"type": "function",
"name": "withdrawStake",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address payable"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"type": "function",
"name": "withdrawTo",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address payable"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"type": "event",
"name": "AccountDeployed",
"inputs": [
{
"name": "userOpHash",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
},
{
"name": "sender",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "factory",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"type": "event",
"name": "Deposited",
"inputs": [
{
"name": "account",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "totalDeposit",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"type": "event",
"name": "UserOperationEvent",
"inputs": [
{
"name": "userOpHash",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
},
{
"name": "sender",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "paymaster",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "nonce",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "success",
"type": "bool",
"indexed": false,
"internalType": "bool"
},
{
"name": "actualGasCost",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "actualGasUsed",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"type": "event",
"name": "UserOperationRevertReason",
"inputs": [
{
"name": "userOpHash",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
},
{
"name": "sender",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "nonce",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "revertReason",
"type": "bytes",
"indexed": false,
"internalType": "bytes"
}
],
"anonymous": false
},
{
"type": "event",
"name": "Withdrawn",
"inputs": [
{
"name": "account",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "to",
"type": "address",
"indexed": false,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"type": "error",
"name": "FailedOp",
"inputs": [
{
"name": "opIndex",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "reason",
"type": "string",
"internalType": "string"
}
]
}
]
0x60806040526004361015610069575b3615610018575f80fd5b60405f33815280602052818120610030348254610e29565b90553381528060205220546040519081527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c460203392a2005b5f3560e01c80630396cb6014610da8578063205c287814610c8e57806322cdde4c14610c4757806335567e1a14610bea57806370a08231146100e7578063765e827f146102045780639cc7c105146101bc578063b760faf91461014f578063bb9fe6bf1461013d578063c23a5cea146101225763fc7e286d0361000e575b3461011e57602036600319011261011e576001600160a01b03610108610ddd565b165f525f602052602060405f2054604051908152f35b5f80fd5b3461011e57602036600319011261011e5761013b610ddd565b005b3461011e575f36600319011261011e57005b602036600319011261011e576001600160a01b0361016b610ddd565b16805f525f60205260405f20610182348254610e29565b9055805f525f6020527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4602060405f2054604051908152a2005b3461011e576101ca36610df3565b9060018060a01b03165f52600160205260405f209060018060c01b03165f5260205260206001600160401b0360405f205416604051908152f35b3461011e57604036600319011261011e576001600160401b036004351161011e5736602360043501121561011e576001600160401b03600435600401351161011e573660246004356004013560051b60043501011161011e576024356001600160a01b038116810361011e575f905f5b6004356004013581106102e857508161028957005b5f918291829182916001600160a01b03165af16102a4610e9a565b50156102ac57005b60405162461bcd60e51b815260206004820152601460248201527322a81d103132b732b334b1b4b0b93c903c3332b960611b6044820152606490fd5b9160248360051b600435010135906101421960043536030182121561011e575a906103196024846004350101610f45565b92600435810160448101356001600160401b0316906001600160a01b039061034390602401610ec9565b165f52600160205260405f2060448360043501013560401c5f52602052806001600160401b0360405f20541603610ba9576001600160401b0360018201116106c7576001600160a01b0361039d6004358401602401610ec9565b165f52600160205260405f2060448360043501013560401c5f526020526001600160401b03600160405f209201166001600160401b031982541617905560146103f460648360043501016024846004350101610edd565b90501015610aa2575b61044661041f600435830160a401356001600160801b0381169060801c610e29565b600435830160e48101356001600160801b0316916104419160c4013590610e29565b611040565b926101048260043501016014610463826024866004350101610edd565b905010155f14610a9a5761047e906024846004350101610edd565b60141161011e573560601c945b5f6001600160a01b03871615610a55575b806020836001600160a01b036104b86004358901602401610ec9565b1660245f896104e2604051978896879586946306608bdf60e21b86526004350101600485016110a4565b03925af1801561077d575f90610a21575b61052c91506040519061050582610e43565b601482527320a0991a1039b4b3b730ba3ab9329032b93937b960611b60208301528b6111cf565b806109eb575b506060946001600160a01b038716610860575b506105c05f8061055b6024876004350101610ec9565b8161057160043589016084810190602401610edd565b9190826040519384928337810182815203926001600160801b0360a48b60043501013516f19261059f610e9a565b84156107f6575b506105bb60c486600435010135915a90610e36565b610e29565b6105db6001600160801b0360e4866004350101351682611040565b956001600160a01b0388166107f0576105fa6024866004350101610ec9565b60018060a01b0381165f525f6020528760405f2054106107a45760018060a01b03165f525f60205260405f20610631888254610e36565b90556001600160a01b0388166106db575b506106b6967f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f91608091906001600160a01b036106856004358901602401610ec9565b1695604460405198600435010135885215156020880152886040880152606087015260018060a01b031694a4610e29565b915f1981146106c757600101610274565b634e487b7160e01b5f52601160045260245ffd5b831561079c575f905b6001600160a01b0389163b1561011e57604051637c627b2160e01b815291600381101561078857826107295f93829360048401526080602484015260848301906111aa565b604482018b9052606482018690520381836001600160a01b038d165af1801561077d5715610642576001600160401b038111610769576040526080610642565b634e487b7160e01b5f52604160045260245ffd5b6040513d5f823e3d90fd5b634e487b7160e01b5f52602160045260245ffd5b6001906106e4565b60848b60405190631101335b60e11b8252600482015260406024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152fd5b876105fa565b837f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a2016108576001600160a01b036108336004358b01602401610ec9565b169360405191829160448c60043501013583526040602084015260408301906111aa565b0390a38a6105a6565b979695945060018060a01b0385165f525f6020528760405f20541061099f575f6108aa95969798604051809781926314add44b60e21b8352856024896004350101600485016110a4565b0381836001600160a01b038b165af194851561077d575f905f96610912575b5061090c9095604051906108dc82610e43565b601882527f41413334207061796d6173746572207369676e6174757265000000000000000060208301528a6111cf565b88610545565b9550503d94855f823e6109258682610e5e565b604081878101031261011e578051906001600160401b03821161011e57868101601f83830101121561011e57818101519061095f82610e7f565b9761096d604051998a610e5e565b828952810160208385840101011161011e5761099660209261090c9484808c0191850101611189565b015195906108c9565b60848760405190631101335b60e11b8252600482015260406024820152601e60448201527f41413331207061796d6173746572206465706f73697420746f6f206c6f7700006064820152fd5b6001600160a01b03610a036004358601602401610ec9565b165f525f602052610a1960405f20918254610e29565b905588610532565b506020813d602011610a4d575b81610a3b60209383610e5e565b8101031261011e5761052c90516104f3565b3d9150610a2e565b506001600160a01b03610a6e6004358501602401610ec9565b165f525f60205260405f2054858110155f14610a8b57505f61049c565b610a959086610e36565b61049c565b505f9461048b565b610ab760043582016064810190602401610edd565b8060141161011e575f91829182604051918260131991828101601487018337810183838201520301923560601c5af1610aee610e9a565b5015610b6457610b046024826004350101610ec9565b610b1960043583016064810190602401610edd565b60149291921161011e57604051913560601c82526001600160a01b03169085907f12033b5552f54f45d46af0b9ad66a5b30cb58df003c5d32ac2e6aaf3779441a090602090a36103fd565b60405162461bcd60e51b815260206004820152601b60248201527f45503a206163636f756e74206372656174696f6e206661696c656400000000006044820152606490fd5b60848760405190631101335b60e11b825260048201526040602482015260126044820152714141323520696e76616c6964206e6f6e636560701b6064820152fd5b3461011e576020610bfa36610df3565b6001600160a01b039091165f9081526001835260408082206001600160c01b03841683528452908190205481519290911b67ffffffffffffffff19166001600160401b0391909116178152f35b3461011e5760031960203682011261011e57600435906001600160401b03821161011e5761012090823603011261011e57610c86602091600401610f45565b604051908152f35b3461011e57604036600319011261011e57610ca7610ddd565b60243590335f525f6020528160405f205410610d6357335f525f60205260405f20610cd3838254610e36565b90556001600160a01b0316905f80808084865af1610cef610e9a565b5015610d285760405191825260208201527fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb60403392a2005b60405162461bcd60e51b815260206004820152601360248201527211540e881dda5d1a191c985dc819985a5b1959606a1b6044820152606490fd5b60405162461bcd60e51b815260206004820152601860248201527f45503a20696e73756666696369656e74206465706f73697400000000000000006044820152606490fd5b602036600319011261011e5760043563ffffffff81160361011e57335f525f60205260405f20610dd9348254610e29565b9055005b600435906001600160a01b038216820361011e57565b604090600319011261011e576004356001600160a01b038116810361011e57906024356001600160c01b038116810361011e5790565b919082018092116106c757565b919082039182116106c757565b604081019081106001600160401b0382111761076957604052565b90601f801991011681019081106001600160401b0382111761076957604052565b6001600160401b03811161076957601f01601f191660200190565b3d15610ec4573d90610eab82610e7f565b91610eb96040519384610e5e565b82523d5f602084013e565b606090565b356001600160a01b038116810361011e5790565b903590601e198136030182121561011e57018035906001600160401b03821161011e5760200191813603831361011e57565b929192610f1b82610e7f565b91610f296040519384610e5e565b82948184528183011161011e578281602093845f960137010152565b610f4e81610ec9565b610f65610f5e6040840184610edd565b3691610f0f565b602081519101209160c0610f7f610f5e6060840184610edd565b6020815191012091610f97610f5e60e0830183610edd565b602081519101209260405195602087019560018060a01b031686526020830135604088015260608701526080860152608081013560a086015260a081013582860152013560e0840152610100908184015282526101208201906001600160401b039083831082841117610769576040839052835190206101408401908152306101608501524661018085015260608352926101a001908111828210176107695760405251902090565b818102929181159184041417156106c757565b9035601e198236030181121561011e5701602081359101916001600160401b03821161011e57813603831361011e57565b908060209392818452848401375f828201840152601f01601f1916010190565b606081529193929181356001600160a01b038116929083900361011e5761110061117f9160409460608501526020810135608085015261116f6110e986830183611053565b9390610120948560a0890152610180880191611084565b916111666111286111146060840184611053565b605f198a8803810160c08c01529691611084565b608083013560e08901526101009560a0840135878a015260c08401359089015261115560e0840184611053565b90868a8403016101408b0152611084565b93810190611053565b9185840301610160860152611084565b9460208201520152565b5f5b83811061119a5750505f910152565b818101518382015260200161118b565b906020916111c381518092818552858086019101611189565b601f01601f1916010190565b9160018083161461129c575065ffffffffffff8160a01c169060d01c8015159081611292575b50611251578015159081611247575b5061120c5750565b60849060405190631101335b60e11b8252600482015260406024820152600c60448201526b10504c8c88195e1c1a5c995960a21b6064820152fd5b905042115f611204565b60848260405190631101335b60e11b8252600482015260406024820152601260448201527110504c8c881b9bdd081d985b1a59081e595d60721b6064820152fd5b905042105f6111f5565b826112c6604051928392631101335b60e11b845260048401526040602484015260448301906111aa565b0390fdfea26469706673582212202c25503101187e920e6fd460d8d27c703e0bb7809df1898df11bd8cafe96014e64736f6c63430008140033
Aucun transfert de token.