{"id":"BlBcNdErXIY","title":"Fungible Token Standard discussion","description":"We'll be discussing the final considerations on the improved fungible token standard. This NEP (NEAR Enhancement Proposal) lives at:\nhttps://github.com/near/NEPs/issues/141\n\nShort history\n------\nThis has been an iterative process where we started with a fungible token standard similar to ERC-20, without the cruft:\nhttps://github.com/near/NEPs/pull/21\n\nThen we discussed a vault-based approach here:\nhttps://github.com/near/NEPs/issues/122","channel_name":"NEAR Protocol","published_at":"2021-01-18T00:00:00.000Z","thumbnail_url":"https://img.youtube.com/vi/BlBcNdErXIY/hqdefault.jpg","transcript_text":"i'm gonna make you a host you can do the sharing okay let's wait for a few minutes uh if more people chew if not then we can start i think we can start with a quick background first on what's going on with the fungible token standards and um later we can go into the new proposal so we have originally had map 21 standard which is mostly a port of um erc20 standard from ethereum to near without much changes so it supported allowance um and two methods transfer and transfer from but because the near there's two significant differences compared to ethereum first it's asynchronous which means the environment in which you call another contract first of all can be can be done uh in parallel so so a token contract can be called parallel to your call to this contract so the state of this country can be updated in the meantime while you're calling it and the second it's a reversibility of um of the state so on ethereum you can revert state from the the cult it's more like a transactional where at the beginning of transaction the state is snatch added like all the changes while the transaction is happening is kind of in the temporary view and at the end of the transaction or at any moment within the transaction you can reverse all changes and cancel this transaction state changes from all all contracts that you touched on near you can only revert your own state and only during this particular call so if you call some other contracts a synchronous promise then then you'll have to commit your own state and then you will not be able to easily revert it unless you called again um the second difference is storage staking so the idea is you your contract the contract the token contract um has to cover entire persistent state of this contract so if your contract is one-to-many meaning it supports multiple users or per user you support multiple data you have to cover all the state from the account balance of the contract so the previous contract was not only one to many users but also every user might have different storage because of allowance so allowances from user to multiple what we call escrow account id so to multiple contracts that created the problem is the um with the balance that has to be attached every time you increase storage and has to be rewarded or like refunded when you decrease storage so let's say you withdraw all the tokens using transfer from from some account um and allowance became zero so in this case we can potentially delete this account so the escrow or like a contract that did this transfer will receive the tokens from the user so the original standard map 21 had two issues one is unpredictable payments of attached balance and second it created slightly more complicated composibility because transfer from did not guarantee a success uh you need to handle it and do reverse plus allowance is kind of usable if you like over declared so the new standard uh proposed originally by robert i think he joined us um it's 136. so this standard is more like a subset of this adopted version we also had another standard proposal which was 122 which requires some extra logic on the contract in a state for the duration of the transaction so this particular standard is only covers the transfer and balance api and it does not cover two extra requirements one is account registration that you use for storage allocation and second is metadata that you you will use to identify the fungible token contract itself the reason why we do not include it because account registration is a common standard for near that will likely to be reused for multiple contracts and not only for fungible tokens so um so let's say you work with one too many accounts then you likely will have to use account registration standard because our state of uh users and second for metadata metadata you cannot can be upgraded in the future but uh the core api doesn't have to change if you only change the metadata so uh let's go through this standard and explain the flow so um so we will review json api which is uh language independent in some way i used a typescript to define the json api but probably can be defined as pure json in arguments but let's um this is also simplification comparing to rust because it doesn't use a custom type such as like account id or you 128 and instead use just strings so the first is naming there is name there was suggestion proposal to use prefix of ft stands for fungible token underscore for all methods related to fungible token and the reason for this is we want to we want to distinguish this standard from some other standards so for example if you ever implement uh openc that works with stablecoin potentially then maybe this contract will have to handle both nfts and fungible tokens and well it's kind of it will be on the receiver side but anyway it kind of helps to distinguish between future standards such as like a fungible token lock-up contract in the past that it also has transformation to indicate that this is uh related to fungible tokens and this particular standard so let's say we implement the future standard maybe we want to have some different prefix i don't know so fungible so transfer um how this api is structured is first it's saying whether it's a change method the view method change method uh requires it to to be called through a transaction and the view method can be called through transaction but also through a view call so you call some kind of rpc call that is free and it can be executed by any node that tracks the chart not necessary the validator node and the change method can only be executed by a validator node on chain and it's also requires to pay gas um okay so then it's a general description of what the method does and logic of it then a bunch of arguments and a return value so this is a kind of high level name for the method so let's start with the transfer so transfer is similar to nep21 except the add optional memo memo field so if you upgrade your previous token standard to this one all the previous apis well actually no because of prefix it's not gonna work but so we use argument for account id called receiver id this is more um a standard way for near protocol because we use receiver id in transactions and receipts internally on the protocol level we also use receiver id for the destination then amount because it's a json it's saying it should be a positive number in decimal string representation so we assume that the amount should be limited by u128 but this is actually can be debated whether you want to limit the amount i think it's reasonable to limit it to u128 but at the same time if we go for example to ethereum tokens they all use u256 and um json does not limit us in size of the decimal representation but at the same time we probably should restrict it to u128 at least for the standard because all the tools currently do not work very well with u256 unless you manually handle it does it make sense to to actually restrict it to u128 in the standard well we can make another recommendation as you said like this is a string so so if you do not restrict it um then maybe some tokens implementation like a receiver of the token will assume this is u128 but it will fail if some other token implements u256 transfers and even so it will be considered a valid standard so i would suggest we say that the maximum amount is u 128 at least for this particular standard i think it won't change i mean it won't change the api yes so the api will stay exactly the same it's just the validation code in the contract well in general it should be handling of these numbers yeah so it's on the api level it's string so right so i mean either you put 100 you 128 you put like any other string wrapper it won't matter yes on the api level yeah on the api level no but we can define or like restrict it on the standard so saying that amount should be at most you want to need and that will um kind of restrict the standard from to be considered valid the amount should be always within the range otherwise it will not be a valid contract implementation for the standard but it will comply with let's say i mean still if somebody will choose differently if somebody will choose 256 it will be compatible right it will be compatible yes but it's kind of like some some let's say if you implement near swap that is generic have a factory um then if one of the contracts tries to use u256 then at some point you will face a problem where you're trying to digitalize q128 and it would throw like overflow like truncated okay um this is what robert suggested uh to add to every transfer and the idea here is very frequently you need to attach some kind of message or memo why this transfer happens so like what's the reason for the transfer or some kind of regulatory reference for this transfer and memory is the field you should put it once we have events similar to like indian events mama will go to events as well potentially or truncated vermont depends on like limits okay um it's optional because as the majority of like automated transfer will not have any memo and putting an empty field versus like no it's kind of just a trade-off of implementation and uh if a contract relies on memo then it's fairly easy to just initiate it with the empty string if it's needed okay next is the most interesting method of this standard so it's a transfer to a contract instead of a regular user and it requires a contract to implement a specific receiver api so it will the way it works it transfers so here's the method it has one extra field message string and the way it works it initiates a transfer and completes it by depositing the amount of tokens to the receiver account first then it creates a promise to receiver id that calls method ft on transfer on the receiver's contract and it passes who sent the tokens so it passes the sender id then it passes the amount and message so messages pass through string that will be given to receiver now a receiver receives this call and should reply with the amount of tokens that it intend to keep from this particular transfer so it should reply from zero to amount if then once a receiver completes a reply a callback is executed on the fungible token and it should handle um the execution of uh the result of this promise on the receiver so if receiver returned a valid value from zero to amount then the difference should be refunded uh back to the sender so the example um can i make a comment yes can we invert that because we are returning an amount can we return the difference directly so you if that will be more intuitive for for everyone so if you um basically in order for you to refund this difference you would need to schedule another promise on the functional pattern no no i mean we are returning how much we used i propose to return how much we are returning so so it's the same idea return 50 instead of return 450. i see so basically it will always return zero right in this case like if you want to consume everything yes correct why this is better than returning the amount consumed because you are when the world you use return identification is the amount you return i mean i think i can go either way big difference yeah well kind of similar um i think it's a matter of taste i i mean i don't see that like the whole world is using dermatology if you say that lucio i was wondering which one is better and i couldn't find which one would be better but i mean yes sounds kind of illogical that you say okay return this but it doesn't mean really like the function of it doesn't mean what we need to return also it feels like from contract implementation it might be easier to just say how much you actually spent so so if you again the reason why you would actually do refunds through this is let's say you have a token contract let's call it die and then you have a unislop that works diet near and when you call swap method on unislope the way you would do this is you would initiate a transfer call to unisop and you would pass a message indicating you want to swap and parameters of the swap then you would attach amount of let's say die slightly higher than the amount you need to receive in year so you say for example i desire to get year here's the amount of die slightly higher to cover for potential price slippage in between then your message received on ft on transfer it computes how much die you actually need to spend it verifies that this die is lower the amount you attach and then it just returns the amount of die you spend it when you return like the amount to refund it's pretty much the same you just say you need to like amount minus this to compute when you say how much you spent you just return the value like how much that you actually cost you um i don't have a strong preference i feel like return value versus return like refund is not really like same thing so changing it um doesn't make a big difference then it also um look i have just yes look how you have how you write it the transfer amount was 500 the contract completely takes it all and should return 500. do you understand that you are using the same word for two different things and most people don't read the documentation so everybody will trip on this if we inverse that is the same you you have to do a a difference you either do it here or in the receiving call and it will be easier to explain somebody not reading the documentation will will do it fine on the first try well there's another return so ft transfer call will return the amount of token actually withdrawn from the sender account the way it works is once you actually calculated the refund like the amount of token consumed by the receiver and refunded the rest back to the sender account you return the amount that was used by sender account i think maybe we can take this is done in a callback i think this is an interesting idea like um we have about a half hour i i do like have other like philosophical questions do you guys want to like take this suggestion and bring it up more in the standard okay let's do let's basically not change the api right now uh and come back to this at least it's if it's only a wording problem then we can figure out how to make it properly explained in the document okay if you want i can write a commander it's not a wording problem it's a intuition problem there's a lot of donation or explanation okay imagine that that you don't read the documentation okay no no still will be like it's a used amount so you need to like return a used amount not a refund amount uh let's explain it here right i mean okay well we can do a pool or something i i don't think for me it's really a matter of taste there is no okay let's continue let's continue and uh come back to this if we have time or otherwise we'll discuss this asynchronously so there's uh security concerns regarding this transfer compared to volts and we discussed this in this standard in this issue um but um let's just reiterate on this so basically if a receiving promise fails returns an error or invalid value we consider this transfer to be not received and we refund tokens back to the sender in our callback so this um this prevents you from locking your tokens through transfer to some contract that does not support it or if you didn't attach enough gas for the transfer call and the receiver can cannot just handle it or if it like implements an invalid api or some some bug happens on the receiver side basically your tokens are not going to stay at the receiver's account because the callback will refund them back to the sender now a second security issue if the receiver contract is azure incorrectly implemented or it's malicious then it can uh withdraw more tokens from its balance because it's already had them on the balance and then return some value that requires it to do a full refund for example so it can spend the tokens and then maybe panic you know it cannot do well kind of so in this case um it's not a problem really for the sender because when sender called this action there was some guards already in place by the sender first account has to already be registered second the contract actually has to do this uh and it's a mistake on the sender side to to use a receiver contract that is invalidly implemented and the most amount a sender can lose is their transfer amount which is you intend to spend it when you actually attach it so there is no an issue from the security perspective of a whole token comparing to this particular transfer plus a receiver cannot overspend their balance like they can only spend their own balance not to send their extra balance i just like throw them out so there's no re-entrance to attack so anything like this and that's why we don't really need volts um or like temporary restrict the storage only to this particular because if a receiver still wants to overspend their balance they could do this even with the world standard at the same time this uh this logic does not require any temporary storage on the fungible token contract implementation plus it does not require a receiver contract to do the withdrawals through a promise so it also simplifies the receiver side now i haven't mentioned this particular part from the simple transfer so the idea here is the way access keys on near work is there's two version of access keys one is full access key that has full permission to the account so you can call any method and second is a restricted access key a restricted function call access key it allows you to from your account call a specific contract and all methods like a restricted set of methods specified by the on the contract but it does not allow to attach deposits uh through this restricted function call so you cannot spend accounts balance when you do a function call and we use this function calls for gaps so when you authorize energy apps so for example on the barrier club you log in it creates access key that is specific only to this particular contract so for example you have a berry club contract and when you log in it creates an access key on your account that goes towards the berry club contract and it allows to now the front end of barry club to issue transactions towards the berry club contract on your behalf without you having to confirm every single transaction so it simplifies the ux and like usability of the gap so why this is relevant for this so if you go to some gap and log in but instead of authorizing their contract they will authorize a fungible token contract so let's say it creates an access key tries to create an access key to like a bridge die contract then it would be able to just issue ft transfer call without you having to confirm this functional like this contract call um on the front end and it can drain your account um this is problematic because we're trying to simplify uh security of near by saying you can safely log into majority of contracts um it's also a problem on the wallet side so wallet should probably prevent you from authorizing die if it knows about that but if there's some kind of contract that is not in a tracking white list or like security contracts of the white list and there's no metadata right now to tell wallet about this then it will allow user to actually do this now that would allow malicious dub to withdraw entire balance for example from the particular contract that it got the authorization from the user solution for this contemporary fix is we say some countries may be willing to implement a security measurement which saying you have to attach at least one yoktan year for this particular function call in order to this method to work so one yoctan year is less than a gas amount one a single gas amount so it's not noticeable from the spent perspective but it will prevent xx key from executing it so this standard actually does not say you have to attach one yoktani air for every call but at the same time it's same that this particular method should be marked as payable in rust which means it should be able to accept deposits i would recommend to put a one-year tenure requirement majority of fungible token contracts that will produce some reasons at the same time there's some reason why you don't want to add this to the standard of one yacht on here do we plan to change that in the future or i'm curious it seems like we should enforce security like basically say you need to attach one yoktani exact for example that seems to make sense to me other folks have thoughts well how how would clients know whether the country would have to know that specific token if it's not we'd have to know whether it requires it or not yeah it wouldn't be so it wouldn't be generic unless it was part of the metadata somehow all the tokens would microsoft then the near security is not working you need to fix that the new security model of calling functions is not working for for functional tokens until they fix that all functional tokens will need when you're near okay yeah we can enforce this i mean one yorkton year is not an issue at any rate so the only question is do you ever need to implement a gear app that does not require this one to year like you actually want to be able to like call transfers as fast as possible from the front end for example without having to confirm every transfer through a wallet if the answer is yes there's still a workaround you can implement another method like a proxy method that will just wrap this ft transfer call this there's a method that attaches one yorktone here and this way you don't need to attach the octane here but yeah okay yeah that's a good point let's um let's enforce one yorkton year deposit on these two methods until we fix the issue in the wallet now again this method takes minima but it's not passed to to the receiver site so a receiving contract will not get the memo and if you need the memo on the receiving side then probably it can be included in the message so the final method is two view calls so it's a total supply and balance off i didn't update this i need to update this um so the only comment on balance off if the account doesn't exist the method doesn't panic and it should return by zero for non-existing accounts that's easier to use when you have a logic to handle it and a second standard that will have to do account registration will have a method to check if the account exists could i ask a kind of bigger question here like and maybe this is just on the implementation of someone but sort of taking a step back force for the trees sort of thing i think um robert and thanks for all the work and versioning you've done on this um i think this i think part of this comes out of robert working on like a near swap situation and so the use case they were kind of thinking about at least i'm thinking about during this discussion is like a swap interface um and now i want to kind of like think about what are the other use cases and you know the future of the open web that we all wish to see and what are there things that we're missing if we don't have like an escrow type system because right now i can think of all these reasons why escrow is clunky doesn't make a lot of sense uh the future of the open web like let's fast forward a couple years i would love to see something similar to like i have my credit card on file uh for a subscription like a monthly subscription um and so i do want to keep subscribing to this community and whatnot escrows are actually pretty useful for that and i guess while that could be added to this standard based on you know someone's implementation um i want to make sure that we're thinking about all the reasons where escrows are used are worthwhile and bring that to the discussion for a second so i i mean that's a good question i was thinking about it uh so uh like in general what we are thinking about here is the transfer transfer and the payment that's that's the primitive we want to really implement so i'm buying something i'm offering something yes uh i mean i'm interacting so in general when i whenever i want to interact with some entity the subscription model you mentioned i think it's very limited and that one could be implemented in a separate standard not a token standard but uh payment subscription standard so that would be a different smart contract and let's cross smart contract which will have allowance yes to uh or like spending allowance to another entity and that would have limit but let's say i would say that this guy can use maximum 100 year per month right yeah go in this and then there may be like many many different options right you don't want to have like a single allowance unlimited allowance or a big allowance without without this limit and this is not this shouldn't be a part of the of the token standard okay also same way we don't have burn and mint on this standard because both of them are extensions so if you have a limited supply token that doesn't allow burnament um then okay so i have one strong objection i already mentioned i mean talked about it in a comment so in general i don't agree about the ft prefixes the reason i don't agree about like the namespaces in the in the function names is because this is against the interface idea the idea of an interface is that i want to describe some property and if someone implements that property then i want to use it adding these interfaces basically destroys that so think about that to think about like a mint function right or a burn function now if you will have ft burn nft burn or whatever burn right so as long as i can burn something which has the same interface i should be able to build to to use it to use that contract and i don't i don't care if this is like particular tangible token or maybe this is some escrow or whatever if we will start adding the matrixes then we use the generality but at the same time if there is a conflict between two and like for non-fungible token there might be a conflict then you will not be able to implement two interfaces if they have conflicting names the reason we also have it is like invasive and contracts all methods are global so they don't have namespaces that usually guard against this so this ft is kinda our namespace for this particular interface correct yes but then then probably like if you want to well like that's the whole thing about the standard right so the question here we should pose is is there any let's say transfer function we would like to use with the same interface imagine you want to implement a functional token and none functional token all in the same contract they will have different interface because non-fungible token will have an id yes but right right wasserman doesn't this this doesn't descend the function from the arguments it doesn't have overload even so in jason we can't do this um correct me if i'm wrong as far as i know you resolve the function by the whole um what's the name of it like the whole header of the function correct yeah but like web assembly doesn't have the interface at all um for the arguments so like our all of our methods like on a lower level it's just like they don't return anything they don't receive anything so all the parsing of arguments is done within the function um so in this case you will have to try to parse either one or another considering like input is a json a binary um extra gas i can still implement i can have two smart contracts with the same function name but different arguments and webassembly will differentiate it correct no well well i mean you can implement overloading of the methods i'm not talking about overloading i'm talking about um the calling convention convention so i'm calling someone someone's else smart contract so let's say i'm calling i don't know contract a dot transfer and um that function will be resolved by name or by the whole delegation declaration i name by name yeah only by name but within yeah within this method holy crust also does not support all methods that doesn't happen overloading but i'm talking about two different smart contracts so let's say you have contract yes in two different smart contracts if you have a trade like different trades like different interfaces then you can yes you can serialize it the way you want and but what we're talking about this is same contract that implements two interfaces yeah but then so in this case it has to handle yeah but okay yes but then we should have different name for for the different interface so let's say if there is another transfer with um with the same argument sorry no if there is another transfer function right with um with same arguments but different meaning yes then it should have different name but yeah but if it's part of the standard then you cannot yeah i can involve it's part of the standard from the client from the javascript from the javascript client how do you right this is what i'm saying like that if if it if if it has different arguments then sorry if it has the same arguments then it should have different name all phonetians must have different names are only identified by their name their arguments are not are not part of the identifier this is like classic c you you're thinking and this is c okay i understand you yes maybe okay um so this is just the final piece um and the interface is take center id which is a string command to the string can message the string so the result is what we need to discuss whether it's a used amount or refund amount and it doesn't have to be payable because it can check who calls it so you cannot really like directly call it and it verifies that the predecessor is a token standard or like token contract that it expects to receive and um it's already have the token so it can immediately spend them if they need to um but need to be careful of to not fail at this action otherwise they might be refunded and that's pretty much it i also want to mention one last thing if that's cool just to viewers who may not be familiar with like promises and async and how to think in a charted you know network and whatnot so when we're talking about promises so like we're gonna say i'm a fungible token contract i'm gonna call another uh contract that i assume is going to do something reasonable um with my you know with this call and then i'm gonna kind of have a call back back to myself and see what happened and you can say i'm only going to use x amount of gas for this call to the other contract um and then you reserve gas for calling back yourself so i think it's important to clarify that like it near like the if there is a malicious contract they can't just do like a uh infinite loop and kind of burn all the gas and make it impossible to call yourself um you only have an allotted amount of gas that they can they can spend so you can make checks to see if there's the proper amount of gas attached and ensure that this all goes as expected well i think that's a feature right so it's a user who decides about how much gas he is going to spend i mean there is a maximum limit and the token contract will always have to reserve enough gas to call the callback right so callback is actually prepaid ahead of time so when you do this implementation callback will be prepaid so you your implementation will be safe because you attached enough gas so long as you attach enough gas to your own callback i think next step from this let's uh summarize this in the document so i think one item was um again let's just reiterate on prefix but i think all of us agreed now uh next is what we need to return uh or from this method whether it's a refund or the used amount let's have a vote like discuss this for using two two two things the my question was really interesting maybe everybody will ask the same question and you can put your answer in the in the in the standard so people can be assured that the then callback will be executed oh yeah okay maybe we can add to the standard the same clarification you made about the gas for the callback for the damn car okay so i made a proposal at the end for for the change in the in the written body sounds good yeah let's vote on this and uh okay so before the final yeah before voting i just want to ask is does anyone has a strong preference with an argument for one or another option except lucha who we already listen it's not a preference for me it's a natural thing to do it's it's evidently natural i don't know it's not choosing a color okay i mean the so basically it will say the method should return the amount of tokens that has to be refunded to the sender that makes it fairly clear check it at the end i i rewrote that part okay should return the amount of unused tokens exactly yes so it makes it fairly clear right you you can return zero your turn 50 and you return like uh is a 500 to panic are you saying the method should panic yeah sounds good to me um i think yeah that's not bad final scene uh we switched to one yoktani requirement for it we decided like i think everyone agrees on this until we fix it in the wallet um we should we should do this in this given standard it's not gonna affect anything except it will prevent the front end from issuing it through the access key and i think it's very important that's good eugene a question is in the road map to change how access keys are managed it requires metadata on a contract the contract will have to say which methods are secure which methods are not secure so when you authorize this access key on the wallet side and you say i want all methods it will say this method requires you to get confirmation every time do you really want to add this access key similarly how you need to confirm and full access key transfer like you need to type your account id so we can do the same once a contract metadata exists this is different contract metadata from a fungible token metadata it has to be generic contract metadata that we plan to work on so yes it's uh in roadmap but it's far away it's probably like q2 because we first need to like complete a full metadata work okay okay great agree everyone and like start switching contracts to this metadata but yeah the metadata work is super cool and like it will be extensible like can solve ton of problems including tools frontend interfaces and stuff like this in this final minute al or trevor or james did you guys have anything to to add thoughts no it looks good to me um i have a question but i'll adjust it honestly okay i have one more thing let's do shoot in many places we should i mean let's use must uppercase mask like there is this rfc um you know way how we describe things and yeah we i i suggest that we use uh must uh must not and may that's like a standardized language for expressing yeah what can be done what can't be done and what may be done okay like you know so and what must must not and may sounds good so okay i think let's summarize this in this issue um the final proposals that we do then uh once we done with this let's redo the top level piece here to indicate all the proposals that are accepted and then polish it for the text but as for api we will get it locked fast and then once everyone like polishes my language then we should be good to go and i will put it in nomicon similar how we have fungible token here so we'll deprecate this token and put a new token standard so you'll call it like deprecated legacy fungible token and put it in nomicon as well then built a few implementations one for assembly scope one for us and link them there as well and that should be good at the same time we can start working on the next two standards that are required for this such as metadata and i account registration yeah but eventually we'll add events then we will need to upgrade that smart that standard because this standard have to implement metadata and have to implement the account registration right yeah so we will need to like in order for this to work then we need to add both of them yes yeah that this trade has to extend the few other things yeah so so yeah we'll need to indicate it in nomicon as well saying a complete fungible token contract has to implement three following maps so this is like current version we'll name we we should probably like give a version for the like something like 1.0 and uh point to the three standards that need to be implemented eventually we'll add events once we have binary events and and yeah go ahead no i was just like saying that we can even mention here like yes uh in the uh somewhere in the example standard yeah somewhere in the preamble explaining that you know yeah we'll update this and uh point to the next to the click currently focuses on sounds good right there but we can create placeholders for now so there's already issues pre-allocated so we can link it before we finalize this one exactly also al thank you thank you al for having the having this be very clean and having the idea of just like proposal change rejected that worked out really well for this so thanks uh one more thing uh let's not use issues discussions are much better we already have the discussions are enabled in the repository i would i would suggest that we ban issues i mean issues to have discussions so the discussion so the difference between the discussion and the issue i mean clearly this thing should be a discussion why because discussion is credit right here if you want to respond to someone you need to scroll you know quote and all these things um can you reply oh yeah you can reply yeah that's that's better yeah let's go for a discussion every uh the issue should be reserved only if there is like a clear link to the pull request that i'm just you know saying that okay things related to a task if i want to define a task and then work on it but okay let's do let's actually migrate this to a discussion i will link a discussion from this issue and later close it once and let's put it all into discussion and then link it back as well for this particular but all future standards should go to discussions exactly um have to update the instruction then to propose the standard right yeah i will need to probably link it as a top of discussion and like put it into docs as well is it the readme map i think it's actually pretty old because it still talks about template and we don't use templates anymore because they cumbersome so maybe you should update a template as well yeah good point like all documentation gets out later yeah right okay um okay sounds like we are done yeah thanks everyone for contributing thanks bye thank you okay bye bye uh mike you probably need to stop streaming first uh yeah i'm trying to figure this out i think i did not actually can you uh make me host again i think maybe that'll give me the other side let me just leave and thank you","transcript_synced_at":"2026-11-04T04:20:04.782Z","segments":[{"start_seconds":11,"text":"i'm gonna make you a host you can do","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=11s"},{"start_seconds":16,"text":"the sharing","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=16s"},{"start_seconds":42,"text":"okay let's wait for a few minutes","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=42s"},{"start_seconds":53,"text":"uh if more people chew","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=53s"},{"start_seconds":105,"text":"if not then","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=105s"},{"start_seconds":116,"text":"we can start","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=116s"},{"start_seconds":128,"text":"i think we can start with a quick background first on what's going on with the fungible token standards","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=128s"},{"start_seconds":135,"text":"and um later we can go into the new proposal","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=135s"},{"start_seconds":144,"text":"so we have originally had map 21","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=144s"},{"start_seconds":151,"text":"standard which is mostly a port","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=151s"},{"start_seconds":158,"text":"of um erc20 standard from ethereum to near","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=158s"},{"start_seconds":165,"text":"without much changes so it supported allowance um and two methods transfer and transfer","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=165s"},{"start_seconds":173,"text":"from but because the near there's two significant differences compared to","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=173s"},{"start_seconds":182,"text":"ethereum first it's asynchronous which means","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=182s"},{"start_seconds":189,"text":"the environment in which you call another contract first of all can be","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=189s"},{"start_seconds":199,"text":"can be done uh in parallel so so a token contract can be called","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=199s"},{"start_seconds":207,"text":"parallel to your call to this contract so the state of this country can be updated in the meantime while you're calling it","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=207s"},{"start_seconds":214,"text":"and the second it's a reversibility of um of the state","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=214s"},{"start_seconds":221,"text":"so on ethereum you can revert state from the the cult it's more like a transactional where","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=221s"},{"start_seconds":229,"text":"at the beginning of transaction the state is snatch added like all the changes while the transaction is happening is kind of in the temporary view","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=229s"},{"start_seconds":237,"text":"and at the end of the transaction or at any moment within the transaction you can reverse all changes and cancel this transaction","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=237s"},{"start_seconds":247,"text":"state changes from all all contracts that you touched on near","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=247s"},{"start_seconds":256,"text":"you can only revert your own state and only during this particular call so if you call some other contracts","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=256s"},{"start_seconds":264,"text":"a synchronous promise then then you'll","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=264s"},{"start_seconds":270,"text":"have to commit your own state and then you will not be able to easily revert it unless you called again","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=270s"},{"start_seconds":279,"text":"um the second difference is storage","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=279s"},{"start_seconds":286,"text":"staking so the idea is you your contract","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=286s"},{"start_seconds":294,"text":"the contract the token contract um has to cover entire persistent","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=294s"},{"start_seconds":304,"text":"state of this contract so if your contract is one-to-many meaning it","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=304s"},{"start_seconds":312,"text":"supports multiple users or per user you support multiple data you have to cover","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=312s"},{"start_seconds":321,"text":"all the state from the account balance of the contract so the previous contract was not only","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=321s"},{"start_seconds":329,"text":"one to many users but also every user might have different storage because of allowance so allowances","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=329s"},{"start_seconds":338,"text":"from user to multiple what we call escrow account id so to multiple contracts that created the","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=338s"},{"start_seconds":345,"text":"problem is the um with the balance that has to be attached every","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=345s"},{"start_seconds":352,"text":"time you increase storage and has to be rewarded or like refunded when you decrease storage so let's say","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=352s"},{"start_seconds":360,"text":"you withdraw all the tokens using transfer from from some account um and allowance became zero","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=360s"},{"start_seconds":369,"text":"so in this case we can potentially delete this account so the escrow or like a contract that did this transfer will receive the","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=369s"},{"start_seconds":378,"text":"tokens from the user so the original standard map 21 had two issues one is","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=378s"},{"start_seconds":387,"text":"unpredictable payments of attached balance and second it created slightly more complicated composibility","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=387s"},{"start_seconds":396,"text":"because transfer from did not guarantee a success uh you need to handle it and do reverse","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=396s"},{"start_seconds":404,"text":"plus allowance is kind of usable if you like","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=404s"},{"start_seconds":411,"text":"over declared so the new standard uh proposed originally by robert","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=411s"},{"start_seconds":419,"text":"i think he joined us um it's 136.","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=419s"},{"start_seconds":426,"text":"so this standard is more like a subset of this adopted version we also had another standard proposal which was","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=426s"},{"start_seconds":434,"text":"122 which requires some extra logic on the","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=434s"},{"start_seconds":442,"text":"contract in a state for the duration of the transaction so this particular standard is","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=442s"},{"start_seconds":450,"text":"only covers the transfer and balance api and it does not cover two extra","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=450s"},{"start_seconds":458,"text":"requirements one is account registration that you use for storage allocation and second","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=458s"},{"start_seconds":465,"text":"is metadata that you you will use to identify the fungible token contract itself","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=465s"},{"start_seconds":474,"text":"the reason why we do not include it because account registration is a common standard for near that will likely to be","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=474s"},{"start_seconds":481,"text":"reused for multiple contracts and not only for fungible tokens so um so let's say you work with one too","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=481s"},{"start_seconds":490,"text":"many accounts then you likely will have to use account registration standard because","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=490s"},{"start_seconds":497,"text":"our state of uh users and second for metadata metadata","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=497s"},{"start_seconds":505,"text":"you cannot can be upgraded in the future but uh the core api doesn't have to","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=505s"},{"start_seconds":512,"text":"change if you only change the metadata so uh let's go through","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=512s"},{"start_seconds":521,"text":"this standard and explain the flow so","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=521s"},{"start_seconds":529,"text":"um so we will review json api which is uh","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=529s"},{"start_seconds":539,"text":"language independent in some way i used a typescript to define the json api","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=539s"},{"start_seconds":545,"text":"but probably can be defined as pure json in arguments but let's um this is also simplification","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=545s"},{"start_seconds":555,"text":"comparing to rust because it doesn't use a custom type such as like account id or you 128","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=555s"},{"start_seconds":564,"text":"and instead use just strings so the first is","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=564s"},{"start_seconds":574,"text":"naming there is name there was suggestion proposal to","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=574s"},{"start_seconds":581,"text":"use prefix of ft stands for fungible token underscore for all methods","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=581s"},{"start_seconds":589,"text":"related to fungible token and the reason for this is we want to","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=589s"},{"start_seconds":600,"text":"we want to distinguish this standard from some other standards so for example if you ever implement","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=600s"},{"start_seconds":610,"text":"uh openc that works with stablecoin potentially then maybe this contract will have to handle both nfts","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=610s"},{"start_seconds":618,"text":"and fungible tokens and well it's kind of it will be on the receiver side","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=618s"},{"start_seconds":627,"text":"but anyway it kind of helps to distinguish between future standards such as like a fungible","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=627s"},{"start_seconds":635,"text":"token lock-up contract in the past that it also has transformation to indicate that this is uh related to","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=635s"},{"start_seconds":644,"text":"fungible tokens and this particular standard so let's say we implement the future standard maybe we want to","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=644s"},{"start_seconds":652,"text":"have some different prefix i don't know so fungible so transfer","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=652s"},{"start_seconds":659,"text":"um how this api is structured is first it's saying whether it's a change method the view method","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=659s"},{"start_seconds":665,"text":"change method uh requires it to to be called through a transaction","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=665s"},{"start_seconds":673,"text":"and the view method can be called through transaction but also through a view call so you call some kind of rpc","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=673s"},{"start_seconds":681,"text":"call that is free and it can be executed by any node that tracks the chart not necessary the","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=681s"},{"start_seconds":688,"text":"validator node and the change method can only be executed by a validator node on chain and it's also requires to pay","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=688s"},{"start_seconds":697,"text":"gas","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=697s"},{"start_seconds":700,"text":"um okay so then it's a general description of what the method does and logic of it","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=700s"},{"start_seconds":710,"text":"then a bunch of arguments and a return value so this is a kind of high level name for the method","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=710s"},{"start_seconds":720,"text":"so let's start with the transfer so transfer is similar to nep21","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=720s"},{"start_seconds":727,"text":"except the add optional memo memo field so if you upgrade your previous token","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=727s"},{"start_seconds":735,"text":"standard to this one all the previous apis well actually no","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=735s"},{"start_seconds":742,"text":"because of prefix it's not gonna work but so we use argument for account id called","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=742s"},{"start_seconds":752,"text":"receiver id this is more um a standard way for near protocol","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=752s"},{"start_seconds":761,"text":"because we use receiver id in transactions and receipts internally on the protocol","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=761s"},{"start_seconds":767,"text":"level we also use receiver id for the destination then amount because it's a json","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=767s"},{"start_seconds":777,"text":"it's saying it should be a positive number in decimal string representation","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=777s"},{"start_seconds":783,"text":"so we assume that the amount should be","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=783s"},{"start_seconds":789,"text":"limited by u128","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=789s"},{"start_seconds":795,"text":"but this is actually can be","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=795s"},{"start_seconds":802,"text":"debated whether you want to limit the amount i think it's reasonable to limit it to u128","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=802s"},{"start_seconds":810,"text":"but at the same time if we go for example to ethereum tokens they all","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=810s"},{"start_seconds":817,"text":"use u256 and um","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=817s"},{"start_seconds":825,"text":"json does not limit us in size of the decimal representation","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=825s"},{"start_seconds":833,"text":"but at the same time we probably should restrict it to u128 at least for the standard","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=833s"},{"start_seconds":839,"text":"because all the tools currently do not work very well with u256 unless you manually handle it","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=839s"},{"start_seconds":849,"text":"does it make sense to to actually restrict it to u128 in the standard","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=849s"},{"start_seconds":860,"text":"well we can make another recommendation","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=860s"},{"start_seconds":865,"text":"as you said like this is a string so so if you do not restrict it","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=865s"},{"start_seconds":873,"text":"um then maybe some tokens implementation","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=873s"},{"start_seconds":879,"text":"like a receiver of the token will assume this is u128 but it will fail if","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=879s"},{"start_seconds":888,"text":"some other token implements u256 transfers and","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=888s"},{"start_seconds":893,"text":"even so it will be considered a valid standard so i would suggest we","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=893s"},{"start_seconds":902,"text":"say that the maximum amount is u 128 at least for this particular","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=902s"},{"start_seconds":910,"text":"standard i think it won't change i mean it won't","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=910s"},{"start_seconds":918,"text":"change the api yes so the api will stay exactly the same it's just the validation code in the contract","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=918s"},{"start_seconds":929,"text":"well in general it should be handling of these numbers yeah so it's on the api level it's","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=929s"},{"start_seconds":937,"text":"string so right so i mean either you put 100 you 128 you put like","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=937s"},{"start_seconds":945,"text":"any other string wrapper it won't matter yes on the api level yeah on the api level no but we can","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=945s"},{"start_seconds":954,"text":"define or like restrict it on the standard so saying that amount should be at most you want to need","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=954s"},{"start_seconds":962,"text":"and that will um kind of restrict the standard from to be considered valid the amount should","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=962s"},{"start_seconds":970,"text":"be always within the range otherwise it will not be a valid contract implementation for the","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=970s"},{"start_seconds":980,"text":"standard but it will comply with let's say i mean still if somebody will choose differently","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=980s"},{"start_seconds":988,"text":"if somebody will choose 256 it will be compatible right","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=988s"},{"start_seconds":996,"text":"it will be compatible yes but it's kind of like some some let's say if you implement near","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=996s"},{"start_seconds":1003,"text":"swap that is generic have a factory um then","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1003s"},{"start_seconds":1011,"text":"if one of the contracts tries to use u256 then at some point you will face a","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1011s"},{"start_seconds":1019,"text":"problem where you're trying to digitalize q128 and it would throw like overflow like truncated","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1019s"},{"start_seconds":1029,"text":"okay um this is what robert suggested uh to","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1029s"},{"start_seconds":1036,"text":"add to every transfer and the idea here is very frequently you need to attach some kind of message or","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1036s"},{"start_seconds":1045,"text":"memo why this transfer happens so like what's the reason for the transfer or some kind of","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1045s"},{"start_seconds":1053,"text":"regulatory reference for this transfer and memory is the field you should put it","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1053s"},{"start_seconds":1061,"text":"once we have events similar to like indian events mama will go to events as well","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1061s"},{"start_seconds":1070,"text":"potentially or truncated vermont depends on like limits","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1070s"},{"start_seconds":1079,"text":"okay um it's optional because as the majority of like automated transfer will not have any","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1079s"},{"start_seconds":1087,"text":"memo and putting an empty field versus","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1087s"},{"start_seconds":1094,"text":"like no it's kind of just a trade-off of implementation","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1094s"},{"start_seconds":1101,"text":"and uh if a contract relies on memo then it's fairly easy to just initiate it","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1101s"},{"start_seconds":1108,"text":"with the empty string if it's needed","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1108s"},{"start_seconds":1116,"text":"okay next is the most interesting method of this","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1116s"},{"start_seconds":1124,"text":"standard so it's a transfer to a contract instead of a regular user","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1124s"},{"start_seconds":1131,"text":"and it requires a contract to implement a specific receiver api","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1131s"},{"start_seconds":1138,"text":"so it will the way it works it transfers so here's the method","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1138s"},{"start_seconds":1147,"text":"it has one extra field message string and","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1147s"},{"start_seconds":1157,"text":"the way it works it initiates a transfer and completes it","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1157s"},{"start_seconds":1164,"text":"by depositing the amount of tokens to the receiver account first","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1164s"},{"start_seconds":1172,"text":"then it creates a promise to receiver id that calls","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1172s"},{"start_seconds":1180,"text":"method ft on transfer on the receiver's contract","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1180s"},{"start_seconds":1188,"text":"and it passes who sent the tokens so it passes the","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1188s"},{"start_seconds":1196,"text":"sender id then it passes the amount and message so messages pass through string","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1196s"},{"start_seconds":1203,"text":"that will be given to receiver now a receiver receives this","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1203s"},{"start_seconds":1212,"text":"call and should reply with the amount of tokens that it intend","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1212s"},{"start_seconds":1220,"text":"to keep from this particular transfer so it should reply from zero to","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1220s"},{"start_seconds":1227,"text":"amount if then once a receiver completes","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1227s"},{"start_seconds":1235,"text":"a reply a callback is executed on the fungible","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1235s"},{"start_seconds":1243,"text":"token and it should handle","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1243s"},{"start_seconds":1249,"text":"um the execution of uh","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1249s"},{"start_seconds":1257,"text":"the result of this promise on the receiver so if receiver returned","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1257s"},{"start_seconds":1265,"text":"a valid value from zero to amount then the difference","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1265s"},{"start_seconds":1272,"text":"should be refunded uh back to the sender so the example","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1272s"},{"start_seconds":1279,"text":"um can i make a comment yes can we invert that","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1279s"},{"start_seconds":1286,"text":"because we are returning an amount can we return the difference directly so you if that will be more intuitive","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1286s"},{"start_seconds":1295,"text":"for for everyone so if you um","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1295s"},{"start_seconds":1307,"text":"basically in order for you to refund this difference you would need to schedule another","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1307s"},{"start_seconds":1316,"text":"promise on the functional pattern no no i mean","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1316s"},{"start_seconds":1323,"text":"we are returning how much we used i propose to return","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1323s"},{"start_seconds":1329,"text":"how much we are returning so so it's the same idea return 50 instead of return 450.","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1329s"},{"start_seconds":1343,"text":"i see so basically it will always return zero","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1343s"},{"start_seconds":1353,"text":"right in this case like if you want to consume everything yes correct","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1353s"},{"start_seconds":1363,"text":"why this is better than returning the amount consumed because you are","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1363s"},{"start_seconds":1370,"text":"when the world you use return identification is the amount you return","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1370s"},{"start_seconds":1381,"text":"i mean","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1381s"},{"start_seconds":1390,"text":"i think i can go either way big difference yeah well kind of similar um","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1390s"},{"start_seconds":1397,"text":"i think it's a matter of taste i i mean i don't see that like the whole world is using dermatology if you say that lucio","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1397s"},{"start_seconds":1404,"text":"i was wondering which one is better and i couldn't find which one would be better but i mean yes sounds","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1404s"},{"start_seconds":1412,"text":"kind of illogical that you say okay return this but it doesn't mean really like the function of it doesn't mean","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1412s"},{"start_seconds":1419,"text":"what we need to return also it feels like from contract implementation","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1419s"},{"start_seconds":1427,"text":"it might be easier to just say how much you actually spent so so if you again the reason why you would","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1427s"},{"start_seconds":1436,"text":"actually do refunds through this is let's say you have a token","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1436s"},{"start_seconds":1445,"text":"contract let's call it die and then you have a unislop that works diet near and when you call","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1445s"},{"start_seconds":1455,"text":"swap method on unislope the way you would do this is you would initiate a transfer call to unisop","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1455s"},{"start_seconds":1463,"text":"and you would pass a message indicating you want to swap and parameters of the swap then you would attach","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1463s"},{"start_seconds":1471,"text":"amount of let's say die slightly higher than the amount you need","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1471s"},{"start_seconds":1479,"text":"to receive in year so you say for example i desire to get year here's the amount of die slightly","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1479s"},{"start_seconds":1488,"text":"higher to cover for potential price slippage in between then your","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1488s"},{"start_seconds":1496,"text":"message received on ft on transfer it computes how much die you actually need to spend","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1496s"},{"start_seconds":1504,"text":"it verifies that this die is lower the amount you attach and then it just returns the amount of die you spend","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1504s"},{"start_seconds":1513,"text":"it when you return like the amount to refund it's pretty much the same you just say you need to","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1513s"},{"start_seconds":1520,"text":"like amount minus this to compute when you say how much you spent you just return the value like how much that you actually cost you","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1520s"},{"start_seconds":1529,"text":"um i don't have a strong preference i feel like return value versus return","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1529s"},{"start_seconds":1538,"text":"like refund is not really like same thing so changing it","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1538s"},{"start_seconds":1546,"text":"um doesn't make a big difference then","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1546s"},{"start_seconds":1554,"text":"it also um look i have just yes look how you have how you write it","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1554s"},{"start_seconds":1562,"text":"the transfer amount was 500 the contract completely takes it all and should return 500. do you understand","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1562s"},{"start_seconds":1570,"text":"that you are using the same word for two different things and most people don't read the documentation","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1570s"},{"start_seconds":1577,"text":"so everybody will trip on this if we inverse that is the same you you have to do a a difference you","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1577s"},{"start_seconds":1586,"text":"either do it here or in the receiving call and it will be easier to explain somebody not reading","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1586s"},{"start_seconds":1595,"text":"the documentation will will do it fine on the first try","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1595s"},{"start_seconds":1607,"text":"well there's another return so ft transfer call","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1607s"},{"start_seconds":1616,"text":"will return the amount of token actually withdrawn from the sender account","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1616s"},{"start_seconds":1623,"text":"the way it works is once you actually calculated the refund","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1623s"},{"start_seconds":1630,"text":"like the amount of token consumed by the receiver","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1630s"},{"start_seconds":1637,"text":"and refunded the rest back to the sender account you return the amount that was used by","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1637s"},{"start_seconds":1645,"text":"sender account i think maybe we can take this is done","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1645s"},{"start_seconds":1653,"text":"in a callback i think this is an interesting idea like um we have about a half hour i i do like have","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1653s"},{"start_seconds":1660,"text":"other like philosophical questions do you guys want to like take this suggestion and bring it up more in the standard","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1660s"},{"start_seconds":1669,"text":"okay let's do let's basically not change the api right now uh and come back to this at least","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1669s"},{"start_seconds":1678,"text":"it's if it's only a wording problem then we can figure out how to make it properly explained in the document","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1678s"},{"start_seconds":1686,"text":"okay if you want i can write a commander it's not a wording problem it's a intuition problem there's a lot of","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1686s"},{"start_seconds":1694,"text":"donation or explanation okay imagine that that you don't read the documentation","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1694s"},{"start_seconds":1705,"text":"okay no no still will be like it's a used amount so you need to like return a used amount","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1705s"},{"start_seconds":1712,"text":"not a refund amount uh let's explain it here right","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1712s"},{"start_seconds":1723,"text":"i mean okay well we can do a pool or something i i don't think for me it's really a matter of taste","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1723s"},{"start_seconds":1733,"text":"there is no okay let's continue let's continue and uh come back to this if we have time","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1733s"},{"start_seconds":1741,"text":"or otherwise we'll discuss this asynchronously","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1741s"},{"start_seconds":1751,"text":"so there's uh security concerns regarding this transfer compared to volts and we discussed this in this","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1751s"},{"start_seconds":1762,"text":"standard in this issue um but","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1762s"},{"start_seconds":1769,"text":"um let's just reiterate on this so basically if a receiving promise","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1769s"},{"start_seconds":1778,"text":"fails returns an error or invalid value we consider this transfer to be","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1778s"},{"start_seconds":1786,"text":"not received and we refund tokens back to the sender in our callback","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1786s"},{"start_seconds":1795,"text":"so this um this prevents you from locking your tokens through transfer to some","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1795s"},{"start_seconds":1805,"text":"contract that does not support it or if you didn't attach enough gas for the transfer call","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1805s"},{"start_seconds":1815,"text":"and the receiver can cannot just handle it or if it like implements an invalid api","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1815s"},{"start_seconds":1823,"text":"or some some bug happens on the receiver side basically your tokens are not going to stay at the receiver's account","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1823s"},{"start_seconds":1831,"text":"because the callback will refund them back to the sender now a second security","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1831s"},{"start_seconds":1839,"text":"issue if the receiver contract is azure incorrectly implemented or it's malicious","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1839s"},{"start_seconds":1848,"text":"then it can uh withdraw more tokens from its balance because it's already had them","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1848s"},{"start_seconds":1855,"text":"on the balance and then return some value that requires it to do a full refund for","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1855s"},{"start_seconds":1864,"text":"example so it can spend the tokens and then maybe panic you know it cannot do well kind of","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1864s"},{"start_seconds":1873,"text":"so in this case um","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1873s"},{"start_seconds":1882,"text":"it's not a problem really for the sender because when sender called this","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1882s"},{"start_seconds":1891,"text":"action there was some guards already in place by the sender first account has to already be registered second the","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1891s"},{"start_seconds":1900,"text":"contract actually has to do this uh and","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1900s"},{"start_seconds":1906,"text":"it's a mistake on the sender side to to use a receiver contract that is","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1906s"},{"start_seconds":1916,"text":"invalidly implemented and the most amount a sender can lose is their transfer amount","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1916s"},{"start_seconds":1924,"text":"which is you intend to spend it when you actually attach it","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1924s"},{"start_seconds":1930,"text":"so there is no an issue from the security perspective of a whole","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1930s"},{"start_seconds":1938,"text":"token comparing to this particular transfer plus a receiver cannot overspend their","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1938s"},{"start_seconds":1946,"text":"balance like they can only spend their own balance not to send their extra balance i just like throw them out so there's no re-entrance to attack so","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1946s"},{"start_seconds":1954,"text":"anything like this","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1954s"},{"start_seconds":1963,"text":"and that's why we don't really need volts um or like temporary restrict the storage only to this particular because","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1963s"},{"start_seconds":1972,"text":"if a receiver still wants to overspend their balance they could do this even with the world standard","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1972s"},{"start_seconds":1980,"text":"at the same time this uh this logic does not require any temporary storage on the fungible token contract","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1980s"},{"start_seconds":1988,"text":"implementation plus it does not require a receiver contract to do the withdrawals through a promise","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1988s"},{"start_seconds":1994,"text":"so it also simplifies the receiver side now i haven't mentioned this particular","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=1994s"},{"start_seconds":2003,"text":"part from the simple transfer so the idea here is","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2003s"},{"start_seconds":2013,"text":"the way access keys on near work is there's two version of access keys one is full access key that has full","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2013s"},{"start_seconds":2021,"text":"permission to the account so you can call any method and second is a restricted access key a restricted","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2021s"},{"start_seconds":2030,"text":"function call access key it allows you to from","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2030s"},{"start_seconds":2036,"text":"your account call a specific contract and","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2036s"},{"start_seconds":2044,"text":"all methods like a restricted set of methods specified by the on the contract","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2044s"},{"start_seconds":2052,"text":"but it does not allow to attach deposits uh through this restricted function call","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2052s"},{"start_seconds":2061,"text":"so you cannot spend accounts balance","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2061s"},{"start_seconds":2071,"text":"when you do a function call and we use this function calls","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2071s"},{"start_seconds":2078,"text":"for gaps so when you authorize energy apps so for example on the barrier club you log in","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2078s"},{"start_seconds":2086,"text":"it creates access key that is specific only to this particular contract","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2086s"},{"start_seconds":2093,"text":"so for example you have a berry club contract and when you log in it creates","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2093s"},{"start_seconds":2101,"text":"an access key on your account that goes towards the berry club contract and it allows to now the","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2101s"},{"start_seconds":2109,"text":"front end of barry club to issue transactions towards the berry club contract on your behalf","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2109s"},{"start_seconds":2118,"text":"without you having to confirm every single transaction so it simplifies the ux and like usability of the","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2118s"},{"start_seconds":2126,"text":"gap so why this is relevant for this so","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2126s"},{"start_seconds":2136,"text":"if you go to some gap and log in but instead of authorizing their contract","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2136s"},{"start_seconds":2143,"text":"they will authorize a fungible token contract so let's say it creates an access key tries to create an access key to","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2143s"},{"start_seconds":2152,"text":"like a bridge die contract then it would be able to just issue ft transfer call without you having to","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2152s"},{"start_seconds":2160,"text":"confirm this functional like this contract call um on the front end and it can drain","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2160s"},{"start_seconds":2168,"text":"your account um this is problematic because","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2168s"},{"start_seconds":2175,"text":"we're trying to simplify uh security of near by","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2175s"},{"start_seconds":2182,"text":"saying you can safely log into majority of contracts um it's also a problem on the wallet","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2182s"},{"start_seconds":2189,"text":"side so wallet should probably prevent you from authorizing die if it knows about that but if there's some kind of contract that is not in a","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2189s"},{"start_seconds":2198,"text":"tracking white list or like security contracts of the white list and there's no metadata right now to tell wallet about this","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2198s"},{"start_seconds":2206,"text":"then it will allow user to actually do this now that would allow malicious dub to","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2206s"},{"start_seconds":2215,"text":"withdraw entire balance for example from the particular contract that it got the authorization from the user","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2215s"},{"start_seconds":2224,"text":"solution for this contemporary fix is we say some countries may be willing","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2224s"},{"start_seconds":2232,"text":"to implement a security measurement which saying","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2232s"},{"start_seconds":2240,"text":"you have to attach at least one yoktan year for this particular function call in order to this method to work","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2240s"},{"start_seconds":2249,"text":"so one yoctan year is less than a gas amount one a single gas amount so it's not","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2249s"},{"start_seconds":2257,"text":"noticeable from the spent perspective but it will prevent","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2257s"},{"start_seconds":2263,"text":"xx key from executing it","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2263s"},{"start_seconds":2273,"text":"so this standard actually does not say you have to attach one yoktani air for every call","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2273s"},{"start_seconds":2281,"text":"but at the same time it's same that this particular method should be marked as payable in rust","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2281s"},{"start_seconds":2289,"text":"which means it should be able to accept deposits","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2289s"},{"start_seconds":2299,"text":"i would recommend to put a one-year tenure requirement majority of fungible token contracts","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2299s"},{"start_seconds":2306,"text":"that will produce some reasons at the same time there's some reason why you don't want to add this to the standard of one yacht on here","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2306s"},{"start_seconds":2314,"text":"do we plan to change that in the future or i'm curious","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2314s"},{"start_seconds":2324,"text":"it seems like we should enforce security like basically say you need to attach one yoktani","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2324s"},{"start_seconds":2331,"text":"exact for example that seems to make sense to me other folks have thoughts well how","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2331s"},{"start_seconds":2340,"text":"how would clients know whether the country would have to know that specific token if it's not we'd have to know","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2340s"},{"start_seconds":2349,"text":"whether it requires it or not yeah it wouldn't be so it wouldn't be generic unless it was part of the metadata","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2349s"},{"start_seconds":2358,"text":"somehow all the tokens would microsoft","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2358s"},{"start_seconds":2366,"text":"then the near security is not working you need to fix that the new security model of calling functions is not working for","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2366s"},{"start_seconds":2374,"text":"for functional tokens until they fix that all functional tokens will need when you're near","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2374s"},{"start_seconds":2382,"text":"okay yeah we can enforce this i mean one yorkton year is not an issue at any rate","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2382s"},{"start_seconds":2389,"text":"so the only question is do you ever need to implement a gear app","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2389s"},{"start_seconds":2399,"text":"that does not require this one to year like you actually want to be able to like call","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2399s"},{"start_seconds":2406,"text":"transfers as fast as possible from the front end for example without having to confirm every transfer through","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2406s"},{"start_seconds":2414,"text":"a wallet if the answer is yes there's still a workaround you can implement another method","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2414s"},{"start_seconds":2422,"text":"like a proxy method that will just wrap this ft transfer call this there's a method that attaches one","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2422s"},{"start_seconds":2430,"text":"yorktone here and this way you don't need to attach the octane here but yeah okay yeah that's a good point let's um","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2430s"},{"start_seconds":2438,"text":"let's enforce one yorkton year deposit on these two methods until we fix the issue in the wallet","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2438s"},{"start_seconds":2448,"text":"now again this method takes minima but it's not passed to to the receiver site","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2448s"},{"start_seconds":2456,"text":"so a receiving contract will not get the memo and if you need the memo on the receiving side then probably it can be","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2456s"},{"start_seconds":2464,"text":"included in the message so the final method is","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2464s"},{"start_seconds":2471,"text":"two view calls so it's a total supply and balance off","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2471s"},{"start_seconds":2479,"text":"i didn't update this i need to update this um so the only comment on balance off","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2479s"},{"start_seconds":2487,"text":"if the account doesn't exist the method doesn't panic and it should return by zero","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2487s"},{"start_seconds":2496,"text":"for non-existing accounts that's easier to use when you have a logic to handle it","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2496s"},{"start_seconds":2505,"text":"and a second standard that will have to do account registration will have a method to check if the account exists","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2505s"},{"start_seconds":2521,"text":"could i ask a kind of bigger question here like and maybe this is just on the implementation of someone but","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2521s"},{"start_seconds":2529,"text":"sort of taking a step back force for the trees sort of thing i think um robert and thanks for all the work and","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2529s"},{"start_seconds":2537,"text":"versioning you've done on this um i think this i think part of this comes out of robert working on like a near swap","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2537s"},{"start_seconds":2545,"text":"situation and so the use case they were kind of thinking about at least i'm thinking about during this discussion is like a swap interface um","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2545s"},{"start_seconds":2553,"text":"and now i want to kind of like think about what are the other use cases and you know the future of the open web that we all wish to see and what are there things","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2553s"},{"start_seconds":2562,"text":"that we're missing if we don't have like an escrow type system because right now i can think of all these reasons why escrow is clunky","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2562s"},{"start_seconds":2570,"text":"doesn't make a lot of sense uh the future of the open web like let's fast forward a couple years i would love to see something","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2570s"},{"start_seconds":2577,"text":"similar to like i have my credit card on file uh for a subscription like a monthly subscription","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2577s"},{"start_seconds":2584,"text":"um and so i do want to keep subscribing to this community and whatnot escrows are actually pretty useful for that","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2584s"},{"start_seconds":2592,"text":"and i guess while that could be added to this standard based on you know someone's implementation um i want to make sure that we're","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2592s"},{"start_seconds":2600,"text":"thinking about all the reasons where escrows are used are worthwhile and bring that to the discussion for a second","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2600s"},{"start_seconds":2607,"text":"so i i mean that's a good question i was thinking about it uh so uh like in general what we are","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2607s"},{"start_seconds":2615,"text":"thinking about here is the transfer transfer and the payment that's that's the primitive we want to really implement","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2615s"},{"start_seconds":2623,"text":"so i'm buying something i'm offering something yes uh i mean i'm interacting so in general when i whenever i want to","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2623s"},{"start_seconds":2631,"text":"interact with some entity the subscription model you mentioned i think","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2631s"},{"start_seconds":2639,"text":"it's very limited and that one could be implemented in a separate standard not a token standard but uh","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2639s"},{"start_seconds":2649,"text":"payment subscription standard so that would be a different smart contract and let's cross smart contract","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2649s"},{"start_seconds":2656,"text":"which will have allowance yes to uh or like spending allowance to another","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2656s"},{"start_seconds":2662,"text":"entity and that would have limit but let's say i would say that this guy can use maximum 100","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2662s"},{"start_seconds":2670,"text":"year per month right yeah go in this and then there may be like many many","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2670s"},{"start_seconds":2679,"text":"different options right you don't want to have like a single allowance unlimited allowance or a big allowance without","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2679s"},{"start_seconds":2686,"text":"without this limit and this is not this shouldn't be a part of the of the token standard okay","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2686s"},{"start_seconds":2695,"text":"also same way we don't have burn and mint on this standard because both of them are extensions","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2695s"},{"start_seconds":2702,"text":"so if you have a limited supply token that doesn't allow burnament","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2702s"},{"start_seconds":2709,"text":"um then okay so i have one strong objection i already mentioned i mean talked about","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2709s"},{"start_seconds":2718,"text":"it in a comment so in general i don't agree about the ft prefixes the reason i don't agree about","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2718s"},{"start_seconds":2725,"text":"like the namespaces in the in the function names is because this is against the interface","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2725s"},{"start_seconds":2732,"text":"idea the idea of an interface is that i want to describe some property","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2732s"},{"start_seconds":2739,"text":"and if someone implements that property then i want to use it adding these interfaces","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2739s"},{"start_seconds":2747,"text":"basically destroys that so think about that to think about like a mint function right or a burn function","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2747s"},{"start_seconds":2755,"text":"now if you will have ft burn nft burn or whatever burn right so as long as i can burn","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2755s"},{"start_seconds":2763,"text":"something which has the same interface i should be able to build to to use it to use that contract and i don't i don't care if this is like","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2763s"},{"start_seconds":2772,"text":"particular tangible token or maybe this is some escrow or whatever if we will start adding the matrixes","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2772s"},{"start_seconds":2781,"text":"then we use the generality but at the same time if there is a conflict between two","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2781s"},{"start_seconds":2789,"text":"and like for non-fungible token there might be a conflict then you will not be able to implement","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2789s"},{"start_seconds":2796,"text":"two interfaces if they have conflicting names the reason we also have it is like","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2796s"},{"start_seconds":2805,"text":"invasive and contracts all methods are global so they don't have","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2805s"},{"start_seconds":2813,"text":"namespaces that usually guard against this so this ft is kinda our namespace","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2813s"},{"start_seconds":2821,"text":"for this particular interface correct yes but then then probably like","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2821s"},{"start_seconds":2828,"text":"if you want to well like that's the whole thing about the standard right so the question here we should pose is","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2828s"},{"start_seconds":2838,"text":"is there any let's say transfer function we would like to use with the same interface","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2838s"},{"start_seconds":2848,"text":"imagine you want to implement a functional token and none functional token all in the same contract","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2848s"},{"start_seconds":2856,"text":"they will have different interface because non-fungible token will have an id yes but right right wasserman doesn't this this","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2856s"},{"start_seconds":2864,"text":"doesn't descend the function from the arguments it doesn't have overload even so in","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2864s"},{"start_seconds":2871,"text":"jason we can't do this um correct me if i'm wrong as far as i know","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2871s"},{"start_seconds":2879,"text":"you resolve the function by the whole um what's the name of it like the whole header of the function","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2879s"},{"start_seconds":2887,"text":"correct yeah but like web assembly doesn't have the interface at all um for the arguments","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2887s"},{"start_seconds":2895,"text":"so like our all of our methods like on a lower level it's just like they don't return anything they don't receive anything","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2895s"},{"start_seconds":2904,"text":"so all the parsing of arguments is done within the function","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2904s"},{"start_seconds":2910,"text":"um so in this case you will have to try to parse either one or another considering like input is a json a binary","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2910s"},{"start_seconds":2918,"text":"um extra gas i can still implement i can have two smart contracts","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2918s"},{"start_seconds":2927,"text":"with the same function name but different arguments and webassembly will differentiate it correct","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2927s"},{"start_seconds":2935,"text":"no well well i mean you can implement overloading of the methods","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2935s"},{"start_seconds":2943,"text":"i'm not talking about overloading i'm talking about um the calling convention convention","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2943s"},{"start_seconds":2950,"text":"so i'm calling someone someone's else smart contract so let's say i'm calling i don't know","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2950s"},{"start_seconds":2957,"text":"contract a dot transfer and um that function will be resolved by","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2957s"},{"start_seconds":2964,"text":"name or by the whole delegation declaration i name by name yeah only by name but within","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2964s"},{"start_seconds":2974,"text":"yeah within this method holy crust also does not support all methods that doesn't happen","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2974s"},{"start_seconds":2981,"text":"overloading but i'm talking about two different smart contracts so let's say you have contract yes in two different smart contracts if you have a trade","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2981s"},{"start_seconds":2989,"text":"like different trades like different interfaces then you can yes you can serialize it the way you want","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2989s"},{"start_seconds":2997,"text":"and but what we're talking about this is same contract that implements two interfaces","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=2997s"},{"start_seconds":3008,"text":"yeah but then so in this case it has to handle yeah but okay yes but then we should have different name for for the different interface","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3008s"},{"start_seconds":3015,"text":"so let's say if there is another transfer with um","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3015s"},{"start_seconds":3024,"text":"with the same argument sorry no if there is another transfer function right","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3024s"},{"start_seconds":3031,"text":"with um with same arguments but different","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3031s"},{"start_seconds":3040,"text":"meaning yes then it should have different name but yeah but if it's part of the","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3040s"},{"start_seconds":3048,"text":"standard then you cannot yeah i can involve it's part of the standard from the client","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3048s"},{"start_seconds":3058,"text":"from the javascript from the javascript client how do you right this is what i'm saying like that","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3058s"},{"start_seconds":3066,"text":"if if it if if it has different arguments then sorry if it has the same arguments then it should have different name","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3066s"},{"start_seconds":3075,"text":"all phonetians must have different names are only identified by their name their arguments","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3075s"},{"start_seconds":3083,"text":"are not are not part of the identifier","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3083s"},{"start_seconds":3087,"text":"this is like classic c","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3087s"},{"start_seconds":3096,"text":"you you're thinking and this is c okay i understand you yes maybe","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3096s"},{"start_seconds":3105,"text":"okay um so this is just the final piece um","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3105s"},{"start_seconds":3114,"text":"and the interface is take center id which is a string command to the string can message the string so the result is what we need to discuss","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3114s"},{"start_seconds":3123,"text":"whether it's a used amount or refund amount and","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3123s"},{"start_seconds":3133,"text":"it doesn't have to be payable because it can check who calls it so you cannot really like directly call","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3133s"},{"start_seconds":3141,"text":"it and it verifies that the predecessor is a token standard or like token contract that it expects to receive","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3141s"},{"start_seconds":3150,"text":"and um it's already have the token so it can","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3150s"},{"start_seconds":3159,"text":"immediately spend them if they need to um but need to be careful of to not fail at this action","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3159s"},{"start_seconds":3168,"text":"otherwise they might be refunded and that's pretty much it","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3168s"},{"start_seconds":3177,"text":"i also want to mention one last thing if that's cool just to viewers who may not be familiar with like promises and async and how to think in a charted you","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3177s"},{"start_seconds":3186,"text":"know network and whatnot so when we're talking about promises so like we're gonna say i'm a fungible token contract i'm gonna call another","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3186s"},{"start_seconds":3195,"text":"uh contract that i assume is going to do something reasonable um with my you know with this call and then i'm gonna kind of have a call","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3195s"},{"start_seconds":3203,"text":"back back to myself and see what happened and you can say i'm only going to use x amount of gas","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3203s"},{"start_seconds":3211,"text":"for this call to the other contract um and then you reserve gas for calling back yourself so i think it's important","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3211s"},{"start_seconds":3220,"text":"to clarify that like it near like the if there is a malicious contract they can't just do like a uh infinite loop and kind of burn all","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3220s"},{"start_seconds":3228,"text":"the gas and make it impossible to call yourself um you only have an allotted amount of gas that they can they can spend so you can make checks to","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3228s"},{"start_seconds":3237,"text":"see if there's the proper amount of gas attached and ensure that this all goes as expected","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3237s"},{"start_seconds":3246,"text":"well i think that's a feature right so it's a user who decides about how much gas he is going to spend i mean there is a maximum limit","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3246s"},{"start_seconds":3254,"text":"and the token contract will always have to reserve enough gas to call the callback","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3254s"},{"start_seconds":3261,"text":"right so callback is actually prepaid ahead of time so when you do this","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3261s"},{"start_seconds":3270,"text":"implementation callback will be prepaid so you your implementation will be safe","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3270s"},{"start_seconds":3278,"text":"because you attached enough gas so long as you attach enough gas to your own callback i think next step from this let's uh","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3278s"},{"start_seconds":3287,"text":"summarize this in the document so i think one item was um again let's just reiterate on prefix","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3287s"},{"start_seconds":3295,"text":"but i think all of us agreed now uh next is what we need to return","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3295s"},{"start_seconds":3303,"text":"uh or from this method whether it's a refund or the used amount","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3303s"},{"start_seconds":3311,"text":"let's have a vote like discuss this for using two two two things","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3311s"},{"start_seconds":3318,"text":"the my question was really interesting maybe everybody will ask the same question","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3318s"},{"start_seconds":3325,"text":"and you can put your answer in the in the in the standard so people can","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3325s"},{"start_seconds":3333,"text":"be assured that the then callback will be executed oh yeah okay","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3333s"},{"start_seconds":3346,"text":"maybe we can add to the standard the same clarification you made about the gas for the callback for the damn","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3346s"},{"start_seconds":3355,"text":"car okay so i made a proposal at the end for for the change in the in the written","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3355s"},{"start_seconds":3363,"text":"body sounds good yeah let's vote on this and uh okay so before the final yeah","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3363s"},{"start_seconds":3373,"text":"before voting i just want to ask is does anyone has a strong preference with an argument for one or another","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3373s"},{"start_seconds":3382,"text":"option except lucha who we already listen it's not a preference for me it's a","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3382s"},{"start_seconds":3391,"text":"natural thing to do it's it's evidently natural","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3391s"},{"start_seconds":3396,"text":"i don't know it's not choosing a color","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3396s"},{"start_seconds":3404,"text":"okay i mean the so basically it will say the method should return the amount of tokens","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3404s"},{"start_seconds":3412,"text":"that has to be refunded to the sender that makes it fairly clear check it at","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3412s"},{"start_seconds":3420,"text":"the end i i rewrote that part okay","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3420s"},{"start_seconds":3427,"text":"should return the amount of unused tokens exactly yes so it makes it fairly clear right you you can return zero your turn 50 and you","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3427s"},{"start_seconds":3435,"text":"return like uh is a 500 to panic","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3435s"},{"start_seconds":3442,"text":"are you saying the method should panic yeah sounds good to me um i think yeah","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3442s"},{"start_seconds":3449,"text":"that's not bad final scene uh we switched to one yoktani requirement for it we decided","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3449s"},{"start_seconds":3457,"text":"like i think everyone agrees on this until we fix it in the wallet um we should we should","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3457s"},{"start_seconds":3466,"text":"do this in this given standard it's not gonna affect anything except it will prevent","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3466s"},{"start_seconds":3473,"text":"the front end from issuing it through the access key and i think it's very important that's","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3473s"},{"start_seconds":3482,"text":"good eugene a question is in the road map to change how","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3482s"},{"start_seconds":3491,"text":"access keys are managed it requires metadata on a contract the contract will have to","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3491s"},{"start_seconds":3499,"text":"say which methods are secure which methods are not secure so when you authorize this access key on the wallet side and you say i want","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3499s"},{"start_seconds":3507,"text":"all methods it will say this method requires you to get confirmation every time do you really want to add","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3507s"},{"start_seconds":3516,"text":"this access key similarly how you need to confirm and full access key transfer like you need to type your account id so we can do the","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3516s"},{"start_seconds":3524,"text":"same once a contract metadata exists this is different contract metadata from a fungible token metadata it has to be generic","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3524s"},{"start_seconds":3533,"text":"contract metadata that we plan to work on so yes it's uh in roadmap but it's far away it's probably like q2","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3533s"},{"start_seconds":3541,"text":"because we first need to like complete a full metadata work okay okay great agree everyone and","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3541s"},{"start_seconds":3548,"text":"like start switching contracts to this metadata but yeah the metadata work is super cool and like","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3548s"},{"start_seconds":3557,"text":"it will be extensible like can solve ton of problems including tools frontend interfaces and","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3557s"},{"start_seconds":3564,"text":"stuff like this in this final minute al or trevor or james did you guys have anything to","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3564s"},{"start_seconds":3570,"text":"to add thoughts no it looks good to me um","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3570s"},{"start_seconds":3577,"text":"i have a question but i'll adjust it honestly okay i have one more thing let's do shoot","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3577s"},{"start_seconds":3584,"text":"in many places we should i mean let's use must uppercase mask like there is this rfc","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3584s"},{"start_seconds":3591,"text":"um you know way how we describe things and","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3591s"},{"start_seconds":3599,"text":"yeah we i i suggest that we use uh must uh must not and may","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3599s"},{"start_seconds":3606,"text":"that's like a standardized language for expressing yeah what can be done what can't be done and what may be done","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3606s"},{"start_seconds":3614,"text":"okay like you know so and what must must not","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3614s"},{"start_seconds":3622,"text":"and may sounds good so okay i think let's summarize this in this","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3622s"},{"start_seconds":3630,"text":"issue um the final proposals that we do then uh","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3630s"},{"start_seconds":3637,"text":"once we done with this let's redo the top level piece here to indicate all the","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3637s"},{"start_seconds":3646,"text":"proposals that are accepted and then polish it for the text but as for api","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3646s"},{"start_seconds":3653,"text":"we will get it locked fast and then once everyone like polishes","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3653s"},{"start_seconds":3660,"text":"my language then we should be good to go and i will put it in nomicon similar how","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3660s"},{"start_seconds":3667,"text":"we have fungible token here so we'll deprecate","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3667s"},{"start_seconds":3675,"text":"this token and put a new token standard so you'll call it like deprecated","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3675s"},{"start_seconds":3683,"text":"legacy fungible token and put it in nomicon as well then","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3683s"},{"start_seconds":3690,"text":"built a few implementations one for assembly scope one for us and link them","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3690s"},{"start_seconds":3696,"text":"there as well and that should be good at the same time we can start working on the next two","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3696s"},{"start_seconds":3705,"text":"standards that are required for this such as metadata and i account registration","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3705s"},{"start_seconds":3714,"text":"yeah but eventually we'll add events then we will need to upgrade that smart that standard because this standard have to implement","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3714s"},{"start_seconds":3722,"text":"metadata and have to implement the account registration right yeah so we will need to like in","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3722s"},{"start_seconds":3732,"text":"order for this to work then we need to add both of them yes yeah that this trade has to extend the few other things","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3732s"},{"start_seconds":3742,"text":"yeah so so yeah we'll need to indicate it in nomicon as well saying a","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3742s"},{"start_seconds":3748,"text":"complete fungible token contract has to implement three following maps so this is like current version we'll name","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3748s"},{"start_seconds":3756,"text":"we we should probably like give a version for the like something like 1.0 and","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3756s"},{"start_seconds":3763,"text":"uh point to the three standards that need to be implemented eventually we'll add events once we have binary","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3763s"},{"start_seconds":3772,"text":"events and and","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3772s"},{"start_seconds":3777,"text":"yeah go ahead no i was just like saying that we can even mention here like yes","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3777s"},{"start_seconds":3783,"text":"uh in the uh somewhere in the example standard yeah somewhere in the preamble explaining that you know yeah we'll","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3783s"},{"start_seconds":3792,"text":"update this and uh point to the next to the click currently focuses on sounds good right there but we can create placeholders for now so","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3792s"},{"start_seconds":3800,"text":"there's already issues pre-allocated so we can link it before we finalize this one exactly also al thank you","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3800s"},{"start_seconds":3808,"text":"thank you al for having the having this be very clean and having the idea of just like proposal change rejected that","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3808s"},{"start_seconds":3816,"text":"worked out really well for this so thanks uh one more thing uh let's not use issues discussions are much better we already have the discussions are","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3816s"},{"start_seconds":3825,"text":"enabled in the repository i would i would suggest that we ban issues","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3825s"},{"start_seconds":3832,"text":"i mean issues to have discussions so the discussion so the difference between the discussion and the issue i mean clearly this thing should be a","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3832s"},{"start_seconds":3840,"text":"discussion why because discussion is credit right here if you want to respond to someone you need to scroll","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3840s"},{"start_seconds":3849,"text":"you know quote and all these things um can you reply oh yeah you can reply yeah that's that's better","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3849s"},{"start_seconds":3856,"text":"yeah let's go for a discussion every uh the issue should be reserved only if there is like a clear link to the pull","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3856s"},{"start_seconds":3863,"text":"request that i'm just you know saying that okay things related to a task if i want to define a task and then","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3863s"},{"start_seconds":3870,"text":"work on it but okay let's do let's actually migrate this to a discussion i will link a discussion from this issue","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3870s"},{"start_seconds":3879,"text":"and later close it once and let's put it all into discussion and then link it back as well for this","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3879s"},{"start_seconds":3886,"text":"particular but all future standards should go to discussions exactly um","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3886s"},{"start_seconds":3894,"text":"have to update the instruction then to propose the standard right yeah i will need to probably link","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3894s"},{"start_seconds":3902,"text":"it as a top of discussion and like put it into docs as well","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3902s"},{"start_seconds":3911,"text":"is it the readme map i think it's actually pretty old because it still","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3911s"},{"start_seconds":3920,"text":"talks about template and we don't use templates anymore because they cumbersome so maybe you should update a template as well","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3920s"},{"start_seconds":3928,"text":"yeah good point like all documentation gets out later yeah right","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3928s"},{"start_seconds":3938,"text":"okay um okay sounds like we are done yeah","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3938s"},{"start_seconds":3947,"text":"thanks everyone for contributing thanks bye thank you","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3947s"},{"start_seconds":3957,"text":"okay bye bye","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3957s"},{"start_seconds":3967,"text":"uh mike you probably need to stop streaming first uh yeah i'm trying to figure this out","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3967s"},{"start_seconds":3974,"text":"i think i did not actually can you uh make me host again i think maybe that'll give me the other side","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3974s"},{"start_seconds":3982,"text":"let me just leave and thank you","url":"https://www.youtube.com/watch?v=BlBcNdErXIY&t=3982s"}],"youtube_url":"https://youtube.com/watch?v=BlBcNdErXIY","url":"https://near-pedia.xyz/videos/BlBcNdErXIY"}